2017-12-13 6 views
-1

にベクトルを比較 -は、私のようなものに見えるのデータフレームを持つデータフレーム

test A B C 
    28 67 4 23 
    45 82 43 56 
    34 8 24 42 

私はその中で、他の3つの列にtestを比較する必要が私は小さい他の列の要素の数を必要とします試験カラム内の対応する要素よりも高い。

だから、所望の出力がある -

test A B C result 
    28 67 4 23  2 
    45 82 43 56  1 
    34 8 24 42  2 

私が試したとき - にtestを複製することなく

Error in Ops.data.frame(df[, comp_vec], df[, name_vec]) : 
‘>’ only defined for equally-sized data frames 

私は道を探しています -

comp_vec = "test" 
name_vec = c("A", "B", "C") 
rowSums(df[, comp_vec] > df[, name_vec]) 

私はエラーを取得しますデータフレームのサイズに一致します。

+2

あなたの入力が変更されていない場合、それはいいだろう - 私はあなたのサンプル出力列の2番目の値を実現するまで私は、サンプル入力として、あなたの最初の行列を使用し、私の答えは働いていなかった理由は非常に混乱していました。 – Gregor

+0

私はそれをしたときに私は同じ気づいた –

+0

私はとても申し訳ありません!今編集しました。最初の行列は間違っていた。 –

答えて

2

sapplyを使用すると、df$testの列を他の3つの列にマッピングするベクトルを返すことができます。それはrowSumsを実行し、result列として設定できるT/F行列を返します。

df <- data.frame(test = c(28, 45, 34), A = c(67, 82, 8), B = c(4, 43, 24), C = c(23, 56, 42)) 

df$result <- rowSums(sapply(df[,2:4], function(x) df$test > x)) 

> df 
    test A B C result 
1 28 67 4 23  2 
2 45 82 43 56  1 
3 34 8 24 42  2 

あなたの期待される結果は、Aの2番目の行に対して82であることに気付きましたが、最初の例では5でした。

0
df$result <- apply(df, 1, function(x) sum(x < x[1])) 

使用apply、行によって示すため1を指定します。 x < x[1]は、行の各位置の値が最初の列の値よりも小さい場合、TRUE/FALSEのベクトルを返します。 sumを使用して、TRUEの値を指定します。

# test A B C result 
# 1 28 67 4 23  2 
# 2 45 82 43 56  1 
# 3 34 8 24 42  2 
関連する問題