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。分享互联网数据分析行业经验。
原文地址:https://www.cnblogs.com/malcolmwallace/p/13867894.html