• R语言data.table常用特殊符号


    .SD, .SDcols

    .SD是指数据中的子集,具体功能是对列进行筛选,可以配合by一起使用。.SDcols可以选择列的子集。

    library(data.table)
    # 生成一个数据
    DT = data.table(
    x = rep(c('b', 'a', 'c'), each = 3),
    v = c(1, 1, 1, 2, 2, 1, 1, 2, 2),
    y = c(1, 3, 6),
    a = 1:9,
    b = 9:1
    )
    DT
    #>    x v y a b
    #> 1: b 1 1 1 9
    #> 2: b 1 3 2 8
    #> 3: b 1 6 3 7
    #> 4: a 2 1 4 6
    #> 5: a 2 3 5 5
    #> 6: a 1 6 6 4
    #> 7: c 1 1 7 3
    #> 8: c 2 3 8 2
    #> 9: c 2 6 9 1
    
    # 对除了 x 之外的列求均值
    DT[ , lapply(.SD, mean), by = x] 
    #>    x v y a b
    #> 1: b 1.000000 3.333333 2 8
    #> 2: a 1.666667 3.333333 5 5
    #> 3: c 1.666667 3.333333 8 2
    
    # 选择列
    DT[ , lapply(.SD, mean), by = x,.SDcols=c('v','y')] 
    #>    x v y
    #> 1: b 1.000000 3.333333
    #> 2: a 1.666667 3.333333
    #> 3: c 1.666667 3.333333
    

    .N和.I

    .N.I应当合起来讲。.N类似nrow()函数,即返回每组的长度,也就是最大行号。而.I类似seq_len(nrow(x)),就是返回行号。

    DT[, .I[1], by=x]
    #>    x V1
    #> 1: b 1
    #> 2: a 4
    #> 3: c 7
    
    # 方括号内可以选择每组内的行数
    DT[, .I[-2], by=x] 
    #>    x V1
    #> 1: b 1
    #> 2: b 3
    #> 3: a 4
    #> 4: a 6
    #> 5: c 7
    #> 6: c 9
    
    # 输出每组的行数
    DT[, .N, by=x] 
    #>    x N
    #> 1: b 3
    #> 2: a 3
    #> 3: c 3
    
    # 返回组内行号
    DT[,rownum:=1:.N,by=x]
    DT
    #>    x v y a b rownum
    #> 1: b 1 1 1 9      1
    #> 2: b 1 3 2 8      2
    #> 3: b 1 6 3 7      3
    #> 4: a 2 1 4 6      1
    #> 5: a 2 3 5 5      2
    #> 6: a 1 6 6 4      3
    #> 7: c 1 1 7 3      1
    #> 8: c 2 3 8 2      2
    #> 9: c 2 6 9 1      3
    

    https://stackoverflow.com/questions/23585999/understanding-i-in-data-table-in-r

    library(data.table)
    set.seed(400)
    DT = data.table(x=sample(LETTERS[1:5], 20, T), key='x')
    DT
    #>     x
    #>  1: A
    #>  2: A
    #>  3: A
    #>  4: B
    #>  5: B
    #>  6: C
    #>  7: C
    #>  8: D
    #>  9: D
    #> 10: D
    #> 11: D
    #> 12: D
    #> 13: D
    #> 14: D
    #> 15: E
    #> 16: E
    #> 17: E
    #> 18: E
    #> 19: E
    #> 20: E
    DT[, .I[x == 'E']]
    #> [1] 15 16 17 18 19 20
    DT[J('E'), .I]  
    #> [1] 1 2 3 4 5 6
    DT['E', .I]  
    #> [1] 1 2 3 4 5 6
    DT[x == 'E', .I]
    #> [1] 1 2 3 4 5 6
    

    .GRP

    .GRP生成分组序号,在根据多变量分组的时候很有用。

    DT[, grp := .GRP, by=.(x,v)] # grp 变量将每一组标上序号
    DT
    #> x v y a b grp
    #> 1: b 1 1 1 9 1
    #> 2: b 1 3 2 8 1
    #> 3: b 1 6 3 7 1
    #> 4: a 2 1 4 6 2
    #> 5: a 2 3 5 5 2
    #> 6: a 1 6 6 4 3
    #> 7: c 1 1 7 3 4
    #> 8: c 2 3 8 2 5
    #> 9: c 2 6 9 1 5
    
    个人公众号:ApocalypseNow。分享互联网数据分析行业经验。
  • 相关阅读:
    VIM配置
    VSCode配置Import@路径
    Sar
    VIM-Fold折叠
    sysctl
    java8 到 java14新增的特性
    Electron整合VUE
    使用Markfile开发GO程序
    cron 表达式
    java spi
  • 原文地址:https://www.cnblogs.com/malcolmwallace/p/13867894.html
Copyright © 2020-2023  润新知