2016-04-20 16 views
1

600行のデータフレームに、カンマで区切られた数字を含む文字変数(ids)を持つデータフレームがあります。データフレームをベクトルと比較し、一致した値の新しい変数を作成する

name ids 
x  8,5,23,56,78,44,54 
y  5,7,23,44 
z  8,44,2 

数値を含む3つの異なるベクトルと上記の値を比較したいと考えました。

a=c(5,7,9,3) 
b=c(8,23,78,66,4) 
c=c(44,54,2,90) 

は、私は本当に任意のアイデアを持っていない

name ids    a   b   c 
x 8,5,23,56,78,44,54 NA  8,23,78  44,54 
y 5,7,23,44    5,7  NA   NA 
z 8,44,2    NA  NA   44,2 

各ベクターで複数回に一致するIDSからの値を含むデータフレーム内のベクトルのための3つの新しい列を作成する必要がありますどのようにこれを比較するのかは、どちらも異なるタイプであり、一度比較し、上のような値をどのように分離するのかです。

答えて

1

私たちは、要素に基づくベクターのサブセットを、listに「」split、それらを介して、listによる「data.frame」の「IDS」列をループをベクトルを配置することができますが%in%分割を見つけlistサブセットのlengthが1であるか、またはelseの場合、paste(つまりtoString)の場合、NAを返すための例外を作成し、出力を 'df1'の新しい列に戻します。

df1[letters[1:3]] <- lapply(list(a, b, c), function(x) 
    sapply(strsplit(df1$ids, ","), function(y) { 
     x1 <- x[x %in% as.numeric(y) ] 
    if(length(x1)>1) toString(x1) else NA 
})) 
+0

これは完璧にakrunで動作します。文字の代わりに、もう1つのことは、列の名前をベクトルの名前にしたい場合、何をすべきかを言います。それぞれのベクトルがa、b、cの代わりに商業、規則的、緊急の名前が付いている場合。どうもありがとうございます。 – ssan

+0

@ssan 'df1 [c(" a "、" b "、" c ")] < - 'を使うことができます。列が2つしかない場合は、手動で行うのは簡単です。 – akrun

+1

ありがとうございました! – ssan

関連する問題