【发布时间】:2015-10-26 18:28:06
【问题描述】:
虽然我之前已经弄清楚了,但我仍然发现自己在 stackoverflow 上搜索(并且无法找到)这种语法,所以...
我想使用.SD 和.SDcols 对data.table 的列的子集执行逐行操作。我永远不记得操作是否需要sapply、lapply,或者是否属于.SD 的括号内。
例如,假设您有两个季度内 10 名学生的数据。在两个季度,他们都有两次考试和一次期末考试。您如何对从 q1 开始的列进行直接平均?
由于过于琐碎的例子很烦人,我还想计算以 q2 开头的列的加权平均值? (权重 = 25% 25% 和 50% 对于 q2)
library(data.table)
set.seed(10)
dt <- data.table(id = paste0("student_", sprintf("%02.f" , 1:10)),
q1_exam1 = round(rnorm(10, .78, .05), 2),
q1_exam2 = round(rnorm(10, .68, .02), 2),
q1_final = round(rnorm(10, .88, .08), 2),
q2_exam1 = round(rnorm(10, .78, .05), 2),
q2_exam2 = round(rnorm(10, .68, .10), 2),
q2_final = round(rnorm(10, .88, .04), 2))
dt
# > dt
# id q1_exam1 q1_exam2 q1_final q2_exam1 q2_exam2 q2_final
# 1: student_01 0.78 0.70 0.83 0.69 0.79 0.86
# 2: student_02 0.77 0.70 0.71 0.78 0.60 0.87
# 3: student_03 0.71 0.68 0.83 0.83 0.60 0.93
# 4: student_04 0.75 0.70 0.71 0.79 0.76 0.97
# 5: student_05 0.79 0.69 0.78 0.71 0.58 0.90
# 6: student_06 0.80 0.68 0.85 0.71 0.68 0.91
# 7: student_07 0.72 0.66 0.82 0.80 0.70 0.84
# 8: student_08 0.76 0.68 0.81 0.69 0.65 0.90
# 9: student_09 0.70 0.70 0.87 0.76 0.61 0.85
# 10: student_10 0.77 0.69 0.86 0.75 0.75 0.89
【问题讨论】:
-
如果您想在
data.table中进行逐行操作,您可以使用.I创建一个索引变量并在by =部分中使用它。 -
如果您关心效率,eddi 在这里对我的问题的回答非常好:stackoverflow.com/a/19279500/1191259(而且,我认为是相关的)
-
我猜您可以通过将数据作为“data.frame”并使用 ["id" "quarter" "exam"] 等列并使用数据库操作或通过“矩阵”的“列表”(取决于方便的因素)并使用更多的“算术”运算。
-
@Jaap 你的意思是像这样使用
.I:stackoverflow.com/questions/16573995/…? (我最初并没有意识到这个例子可能是相关的,感谢 Frank 在 github 上向我展示了这个) -
使用
by = 1:nrow(dt)。或者根据操作,您可能可以在j中使用Reduce()。
标签: r data.table