2017-02-28 72 views
0

這是一個我認爲的簡單問題,但我一直無法使其工作。我有一個數據框與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 

我有變量 「類」

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

的名單,我想產生一個新變量的Class1 = 1,如果VAR1 | Var2 = 1,否則爲0。

我可以做到這一點少用優雅的方式,但想做出一個更加自動化的功能/循環/應用,將創造ClassVar,搜索班級名冊和重新編碼適當地生成以下內容:

# 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的鞏固,所以用if_else做蠻力並不會有效。有什麼建議麼?

我做到目前爲止的部分是生成類變量:

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

回答

0

這裏是一個基R法與lapplymax.col和基質子集:

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

返回

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 

這裏,lapply適用max.colClassList的每個元素,它返回每行最大值的列的位置。我將這些列位置綁定到行位置以返回指示每行最大元素位置的矩陣。然後將這些數據從data.frame中提取出來並作爲矢量返回。 df[i]用於將data.frame分配給ClassList的每個元素中包含的列。

+0

這工作完美,謝謝! – KevinM