2017-02-28 2 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 

私はVAR1場合= 1新しい変数のClass1を生成したい

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

を変数 "クラス" のリストを持っています| Var2 = 1、そうでない場合は0。

私はあまりエレガントな手段を用いてこれを行うことができますが、より自動化された機能/ループを作りたい/それは、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とClasseの多くが統合され、if_elseで無理矢理力を発揮することは効率的ではありません。助言がありますか?

私はこれまでなかった部分はクラス変数を生成することである:ここ

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

答えて

0

は、lapply有する基地R方式でmax.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 

ここで、lapplymax.colClassListの各要素に渡します。これは、各行の最大値を持つ列の位置を返します。これらの列の位置を行の位置にバインドして、各行の最大要素の位置を示す行列を返します。これらはdata.frameから抽出され、ベクトルとして返されます。 df[i]は、data.frameをClassListの各要素に含まれる列にサブセット化するために使用されます。

+0

これは完全に機能しました。ありがとうございます! – KevinM

関連する問題