【发布时间】:2014-05-28 14:15:44
【问题描述】:
我有一个看起来像这样的data.table:
DT <- data.table(Feature1 = c("yes", "yes", "yes", "no", "no"),
Feature2 = c("yes", "yes", "yes", "yes", "no"),
Feature3 = c("yes", "yes", "yes", "yes", "no"),
Var1 = c("yes", "yes", "no", "yes", "no"),
Var2 = c("yes", "yes", "yes", "yes", "yes"))
DT
## Feature1 Feature2 Feature3 Var1 Var2
##1: no no no no yes
##2: no yes yes yes yes
##3: yes yes yes yes yes
##4: yes yes yes yes yes
##5: yes yes yes no yes
现在我想计算所有可能的功能组合的“Var1”为“是”的发生率和比例,“Var2”在这些组合中为“是”等。我需要一个计数以及每个组合再次回答“是”的比例。
获取一个变量的计数很容易。因为我不想放弃任何组合,所以我使用CJ 而不是by:
DT[,`:=`(Feature1 = as.factor(Feature1),
Feature2 = as.factor(Feature2),
Feature3 = as.factor(Feature3))]
(顺便说一句,有没有更好的方法一次将多个列设置为因子?)
setkeyv(DT, c("Feature1", "Feature2", "Feature3", "Var1"))
DT2 <- DT[CJ(levels(Feature1), levels(Feature2), levels(Feature3), "yes"),
list(Var1.count = .N)]
DT2[, Var1 := NULL]
但是,使用CJ 意味着我必须为每个变量设置一个新键。如果我有 100 个呢?有没有比设置for-loop 更好的方法来做到这一点?另外,我如何从这里得到比例?例如,对于“是、是、是”特征的组合,Var1 两次是“是”,一次是“否”,所以我想在相应行中获得另一列名为 Var1.prop 的值为 0.66。
本质上,这就是我的目标:
Feature1 Feature2 Feature3 Var1 Var1.count Var1.prop Var2.count Var2.prop
1: no no no yes 0 NA 1 1.00
2: no no yes yes 0 NA 0 NA
3: no yes no yes 0 NA 0 NA
4: no yes yes yes 1 1.00 1 1.00
5: yes no no yes 0 NA 0 NA
6: yes no yes yes 0 NA 0 NA
7: yes yes no yes 0 NA 0 NA
8: yes yes yes yes 2 0.66 3 1.00
解决方案应该针对大量不同的功能和变量进行扩展。我更喜欢使用data.table,因为它比普通的data.frame 操作要快得多,而且我发现与dplyr 相比,它更易于在函数中使用。话虽如此,我也会接受data.frame 的简洁且不太低效的解决方案。
@Arun 回答后更新。这真的很简洁,但它不能很好地扩展到,比如说,100 个变量。我一直在尝试以这种方式构建 Arun 的答案,但它只返回一个空的 data.table 以及一个警告:
vars <- c("Var1", "Var2")
tmps <- paste0(vars, ".tmp")
ans <- DTn[, { for (var in vars){
assign(paste0(var, ".tmp"), sum(var == "yes", na.rm = TRUE));
list(assign(paste0(var, ".count"), get(paste0(var, ".tmp"))),
assign(paste0(var, ".prop"), get(paste0(var, ".tmp"))/.N)
)
}}, by = key(DT), with = FALSE]
这里出了什么问题?
【问题讨论】:
标签: r dataframe data.table