R 使用with=FALSE和.SD来子集.SD的行

R 使用with=FALSE和.SD来子集.SD的行,r,data.table,R,Data.table,我有一个data.table,其中包含多个变量,这些变量的值数量有限。对于每个变量,我想建立一个表,计算具有每个值的观测值的分数,并进行分组 示例数据: 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

我有一个data.table,其中包含多个变量,这些变量的值数量有限。对于每个变量,我想建立一个表,计算具有每个值的观测值的分数,并进行分组

示例数据:

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"]
但是因为我有很多变量,所以我想在循环中进行。我在外部调用和
.SD
调用中都使用了
with=FALSE
,但一直没有正确使用。理想情况下,我可以将列名传递给
.SD
I
子集,
.SDcols
,理想情况下,作为
paste0()
的参数来创建输出变量名(例如
paste0(varName,“\u 1”)


变量
prop.表
通常便于构建此类比例表

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

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

我们也可以从
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

我们也可以从
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