2017-11-15 18 views
3

言うの一方がデータフレームを有する:データフレーム条件複数の行

data <- data.frame('obs' = c('a','c','b'), 'top1' = c('a','b','c'), 'top2' = c('b', 'c', 'f'), 'top3' = c('g', 'h', 'd')) 

Iは、以下の方法で動作する条件である新しい列topnを計算するために、WAN:obsの値である場合top列のいずれかがtopnになるようにする必要があります。そうでない場合はtopnに任意の値、たとえばtop1を割り当てることができます。もちろん、私はorifelseでこれを行うことができますが、私はテーブルに最大10個のtopの列を持つことができるので、それを書くためのより短い方法を探しています。

obs top1 top2 top3 topn 
    a a b g a 
    c b c h c 
    b c f d c 
+0

OBSは、最初の列であり、他のすべてが 'トップ' 'データであれば、これは良いかもしれません$ topn = data [cbind(1:nrow(data) 、%x [-1]))))])] 'に1を加えて(data、1、function(x)1 +! –

答えて

2

我々はベクトル化されたアプローチを探しているなら、私たちは、その後ifelseで論理vector

i1 <- data[-1] == data['obs'][col(data[-1])] 
data$topn <- ifelse(rowSums(i1) != 0, as.character(data$obs), as.character(data$top1)) 
data$topn 
#[1] "a" "c" "c" 
に基づいて列の値を取得し、任意の一致があるかどうかを見つけるために、論理的 matrixrowSumsを使用することができます
1

これは参考になる場合があります。

f=function(a){ 

if(a[1] %in% a[-1]){

return (a[1]) 
    } 

else{sample(a[-1],1)}

}

data$topn=apply(data,1,f)