2017-05-10 8 views
2

内の行のサブセットにベクトルを比較:私はdata.frame「DAT」と数値ベクトル「テスト」を持っているdata.frame

code <- c("A22", "B15", "C03") 
v.1 <- 1:3 
v.2 <- 3:1 
v.3 <- c(2, NA, 2) 
bob <- c("yes", "no", "no") 
dat <- data.frame(code, v.1, v.2, v.3, bob, stringsAsFactors = FALSE) 
test <- c(3, 1, 2) 

を私はどこdata.frame内の行を見つけたいです2番目から4番目の列( "v.1"、 "v.2"、 "v.3")は、ベクトルと同じ値を同じ順序で含み、 "code" -columnから値を返します(inこの場合 "C03")。

私は

dat[dat[, 2:4] == test]$code 

動作しません。どちらも
which(apply(dat, 1, function(x) all.equal(dat[, 2:4], test)) == FALSE) 

を試してみました。

私は基本R.とソリューションを好むだろう

私達はちょうど私たちは「コードが必要な場合は、比較

dat[2:4] == test[row(dat[2:4])] 

を行う前に、長さが等しくなるようにする「テスト」を複製する必要が

+1

row.names(サブセット(DAT、DATの$のV.1 ==テスト[1]&ダット$ v.2 == test [2]&dat $ v.3 == test [3]))は、必要な行を返します。これらの行の "code"値を知りたい場合は、subset()関数select = "code"に追加します。それはあなたに何を助けますか? –

+0

@MarioM。それはうまくいきますが、その解決策では、data.frameのすべての列名と大規模なデータセットではやや不透明なベクトルのすべてのインデックスを入力する必要があります。 –

+3

あなたの2番目のオプションで動作するようにするには: ''(apply(dat [、2:4]、1、function(x)all(x == test))) ' – Cath

答えて

0

私たちは一緒に列をpasteと同じを持っている行をチェックすることができますapplyで「

dat$code[rowSums(dat[2:4] == test[row(dat[2:4])], na.rm = TRUE)==3] 
#[1] C03 
+3

一致する行を取得するには、 'dat $ code [which(apply [dat [2:4] == test [col(dat [2:4])]、1、sum)== length(test))]' – R18

+0

@akrun For何らかの理由で、問題のサンプルデータの代わりに私の実際のデータを使用すると、正しいコードと多数のNAsが返されます。「P040105」NA NA NA NA NA NA'コードのみ。 –

+0

@whatあなたは 'dat $ code [rowSums(dat [2:4] == test [row(dat [2:4])])== 3]' – akrun

1

値をtestとして貼り付け、それぞれの行の列codeを選択します。

dat[apply(dat[2:4], 1, paste0, collapse = "|") == 
         paste0(test, collapse = "|"), "code"] 

#[1] C03 
2

which付き)あなたの2番目のオプションは、いくつかの問題のために動作しません:全体datapplyを使用すると、charactermatrixに変換しますが、実際に、関数の引数をxを使用していない、あなたが使用する必要がありますallall.equalの代わりに、おそらくFALSEの代わりにTRUEとなります(比較は実際には必要ありません)。

あなたはそれを動作させるためにそれを少し変更することができます。

which(apply(dat[, 2:4], 1, function(x) all(x==test))) 
[1] 3 

それとも

dat[apply(dat[, 2:4], 1, function(x) all(x==test)), "code"] 
[1] C03 
関連する問題