我有一个如下所示的数据框:
SubjectID Activity V1 V2 V3
1 2 S 0.2571778 -0.02328523 -0.01465376
2 2 W 0.2860267 -0.01316336 -0.11908252
3 3 R 0.2754848 -0.02605042 -0.11815167
4 3 W 0.2702982 -0.03261387 -0.11752018
5 4 A 0.2748330 -0.02784779 -0.12952716
6 4 S 0.2792199 -0.01862040 -0.11390197
...
(实际上还有更多的 Vn 变量,但这说明了问题。)
我想使用xtabs()
来查看所有Vn变量,但保持SubjectID和Activity不变 - 就像
xtabs(c(V1, V2, V3) ~ SubjectID + Activity, data = DF)
或
lapply(c(V1, V2, V3), function(x) xtabs(x ~ SubjectID + Activity, data = DF))
但是这些当然行不通。什么是正确的方法?
编辑:我想要的是
xtabs(V1 ~ SubjectID + Activty, data = DF)
xtabs(V2 ~ SubjectID + Activty, data = DF)
xtabs(V3 ~ SubjectID + Activty, data = DF)
...
最佳答案
在提供感兴趣的列的字符向量后,您应该能够使用 get
。
lapply(c("V1", "V2", "V3"), function(x) xtabs(get(x) ~ SubjectID + Activity, data = DF))
使用“空气质量”数据集尝试一下:
setNames(lapply(names(airquality)[1:4],
function(x) xtabs(get(x) ~ Month + Day, airquality)),
names(airquality)[1:4])
根据您的评论,如果您需要广泛的数据集,我建议您考虑使用“data.table”和 dcast
ing。
这是一个例子:
set.seed(1)
DF <- cbind(warpbreaks, V2 = sample(100, nrow(warpbreaks)), V3 = sample(100, nrow(warpbreaks)))
library(data.table)
setDT(DF)
lapply(c("breaks", "V2", "V3"), function(x) {
dcast(DF[, lapply(.SD, mean), .(wool, tension)], wool ~ tension, value.var = x)
})
# [[1]]
# wool L M H
# 1: A 44.55556 24.00000 24.55556
# 2: B 28.22222 28.77778 18.77778
#
# [[2]]
# wool L M H
# 1: A 59.22222 46.33333 33.22222
# 2: B 49.44444 44.77778 43.22222
#
# [[3]]
# wool L M H
# 1: A 40 68.11111 74.22222
# 2: B 48 40.11111 37.77778
或者,您可以拥有一个完全宽的“data.table”,如下所示:
dcast(DF[, lapply(.SD, mean), .(wool, tension)], wool ~ tension,
value.var = c("breaks", "V2", "V3"))
# wool breaks_L breaks_M breaks_H V2_L V2_M V2_H V3_L V3_M V3_H
# 1: A 44.55556 24.00000 24.55556 59.22222 46.33333 33.22222 40 68.11111 74.22222
# 2: B 28.22222 28.77778 18.77778 49.44444 44.77778 43.22222 48 40.11111 37.77778
关于r - 如何使用多个变量但相同的分割进行交叉制表(xtabs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47862331/