通过自动搜索列表生成新的计算变量

Generate new calculated variable with automated search of list

我认为这是一个简单的问题,但我很难让它工作。

我有一个带有 id 变量(唯一行)的数据框,以及一系列带有二进制 (0,1) 结果的列。

# ID Var1 Var2 Var3 Var4 Var5
# 1  0    0    0    1    0
# 2  1    0    0    0    0
# 3  0    1    0    0    0

我有一个变量列表 "classes"

ClassList = list(Class1 = c("Var1", "Var2"), Class2 = c("Var3", "Var4","Var5") 

我想生成一个新变量 Class1 = 1 if Var1 | Var2 = 1,否则为 0。

我可以使用不太优雅的方法来做到这一点,但我想制作一个更自动化的 function/loop/apply 来创建 ClassVar、搜索 ClassList 并适当地重新编码以生成以下内容:

# ID Var1 Var2 Var3 Var4 Var5 Class1 Class2
# 1  0    0    0    1    0    0      1
# 2  1    0    0    0    0    1      0
# 3  0    1    0    0    0    1      0

有很多 Var's 和 Classe's 需要合并,所以用 if_else 进行暴力破解效率不高。有什么建议吗?

到目前为止我所做的部分是生成 class 变量:

for (I in 1:length(ClassList)) {
 classname <- names(ClassList)[I] 
 df[,paste0(classname)] <- NA
 }

这是一个基本的 R 方法,其中包含 lapplymax.col 和矩阵子集:

df[names(ClassList)] <- lapply(ClassList,
                               function(i) df[i][cbind(seq_len(nrow(df)), max.col(df[i]))])

哪个return

df
  ID Var1 Var2 Var3 Var4 Var5 Class1 Class2
1  1    0    0    0    1    0      0      1
2  2    1    0    0    0    0      1      0
3  3    0    1    0    0    0      1      0

这里,lapplymax.col 应用到ClassList 的每个元素,其中return 是每行具有最大值的列的位置。我将这些列位置与行位置绑定到 return 一个矩阵,该矩阵指示每行的最大元素的位置。然后将这些从 data.frame 和 returned 中提取为向量。 df[i] 用于将 data.frame 子集化为 ClassList 的每个元素中包含的那些列。