我有一个data.table,其中包含多个变量,这些变量的值有限。对于每个变量,我想构建一个表来计算具有每个值的观察的分数,并进行分组。
示例数据:
SELECT DISTINCT phrase, len(phrase) l, [id] FROM X WHERE CONTAINS(phrase, searchPhrase)
我想要两个结果表:
OPTIMIZE FOR
,同样适用于data = data.table(group = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3),
Var1 = c(1,1,2,2,3,1,2,3,2,2,3,1,2,3,1),
Var2 = c(1,1,2,3,2,2,2,2,1,2,3,2,1,1,3))
。这对于单个变量来说很简单:
Var1:
group | Var1_1 | Var1_2 | Var1_3
------|---------|---------|---------
1 | .4 | .4 | .2
2 | .2 | .6 | .2
3 | .4 | .2 | .4
但是因为我有很多变量,所以我想在一个循环中这样做。我已经在外线通话和Var2
通话中使用了data[, .(Var1_1 = .SD[Var1 == 1, .N]/.N,
Var1_2 = .SD[Var1 == 2, .N]/.N,
Var1_3 = .SD[Var1 == 3, .N]/.N), by = group, .SDcols = "Var1"]
,但是还没有能够做到正确。理想情况下,我可以将列名称传递给with = FALSE
' s .SD
子集.SD
,理想情况下,作为i
的参数来创建输出变量名称(例如.SDcols
)。
paste0()
有关如何执行此操作的任何建议?
答案 0 :(得分:2)
我们也可以使用dcast
data.table
执行此操作
lapply(variables, function(x) dcast(data[, .N , c('group', x)][,
Perc := N/sum(N), group][, N := NULL], group~..., value.var = "Perc", fill = 0))
#[[1]]
# group 1 2 3
#1: 1 0.4 0.4 0.2
#2: 2 0.2 0.6 0.2
#3: 3 0.4 0.2 0.4
#[[2]]
# group 1 2 3
#1: 1 0.4 0.4 0.2
#2: 2 0.2 0.8 0.0
#3: 3 0.4 0.2 0.4
答案 1 :(得分:1)
table
和prop.table
通常可以方便地构建这样的比例表。
lapply(variables, function(var) data[, prop.table(table(group, get(var)), margin = 1)])
#[[1]]
#group 1 2 3
# 1 0.4 0.4 0.2
# 2 0.2 0.6 0.2
# 3 0.4 0.2 0.4
#[[2]]
#group 1 2 3
# 1 0.4 0.4 0.2
# 2 0.2 0.8 0.0
# 3 0.4 0.2 0.4