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。分享互联网数据分析行业经验。