2017-01-10 8 views
0

と階層ifelse条件Iは、次のような問題へのエレガントな解決策を探しています:R:複数、並列成果

私は別のマッチング基準に基づいて企業に所有者を割り当てる必要があります。これらのマッチング基準は異なる品質のものであるため、より質の低い基準は結果が得られない場合にのみ使用されるべきである。私の例では、すべてのa基準は、b基準と同じ品質レベルと高品質です。

私のポイントを説明するために、以下:

firmname <- c("Firm A", "Firm B", "Firm C", "Firm D", "Firm E", "Firm F") 
ownermatch_a1 <- c("Owner 1", NA, NA, NA, "Owner 5", "Owner 6") 
ownermatch_a2 <- c("Owner 1", NA, NA, "Owner 4", "Owner 5", "Owner 6") 
ownermatch_a3 <- c("Owner 1", NA, "Owner 3", "Owner 4", "Owner 5", "Owner 6") 
ownermatch_b1 <- c("Owner 1", "Owner 2", "Owner 3", "Owner 4", "Owner 5", "Owner 6") 
ownerfinal <- (NA) 

data.frame(firmname, ownermatch_a1, ownermatch_a2, ownermatch_a3, ownermatch_b1, ownerfinal) 

これは、次の表

firmname ownermatch_a1 ownermatch_a2 ownermatch_a3 ownermatch_b1 ownerfinal 
1 Firm A  Owner 1  Owner 1  Owner 1  Owner 1  <NA> 
2 Firm B   <NA>   <NA>   <NA>  Owner 2  <NA> 
3 Firm C   <NA>   <NA>  Owner 3  Owner 3  <NA> 
4 Firm D   <NA>  Owner 4  Owner 4  Owner 4  <NA> 
5 Firm E  Owner 5  Owner 5  Owner 5  Owner 5  <NA> 
6 Firm F  Owner 6  Owner 6  Owner 6  Owner 6  <NA> 

をもたらし、私は今、Rは、次の操作を実行したい: 1)3 aのいずれかの事務所1つが基準がNAでない場合は、ownerfinalとしてください。 2)aが非NAである場合は、これらをランダムにとり、ownerfinal としてください。3)これらのすべてがNAである場合のみ、ownermatch_b1をとり、ownerfinalとしてください。

だから例の上記: 企業A: 企業B A3、A2、A1のいずれかを選んで:B1 事務所Cピック:A2またはA3

のいずれかを選んでいただきありがとうございます:A3 事務所Dピック!

+0

はと 'しないでください.data.frame(cbind(...)) ';すべてのものを行列に変換してから、data.frameに変換することになります。代わりに、単に 'data.frame'を直接使用してください。 'data.frame(a = c( 'foo'、 'bar')、b = 1:2)'となります。 – alistaire

+0

@DarshanBaralはい、それは完全に上手くいくでしょう! – deca

+0

@alistaire提案に感謝します。この例ではこれを編集します。 – deca

答えて

2

ここではループは必要ありません。 ?max.colは列にわたって有効な例を見つけ、ランダムに1を選ぶためのあなたの友達です:

tmp <- dat[2:4][cbind(seq_len(nrow(dat)), max.col(is.na(dat[2:4])))] 
dat$ownerfinal <- replace(tmp, is.na(tmp), as.character(dat$ownermatch_b1)[is.na(tmp)]) 
dat 

# firmname ownermatch_a1 ownermatch_a2 ownermatch_a3 ownermatch_b1 ownerfinal 
#1 Firm A  Owner 1  Owner 1  Owner 1  Owner 1 Owner 1 
#2 Firm B   <NA>   <NA>   <NA>  Owner 2 Owner 2 
#3 Firm C   <NA>   <NA>  Owner 3  Owner 3 Owner 3 
#4 Firm D   <NA>  Owner 4  Owner 4  Owner 4 Owner 4 
#5 Firm E  Owner 5  Owner 5  Owner 5  Owner 5 Owner 5 
#6 Firm F  Owner 6  Owner 6  Owner 6  Owner 6 Owner 6 

あなたが最初の有効な結果を取りたい場合にもpmaxを使用することができます。

do.call(pmax, c(lapply(dat[2:5],as.character), na.rm=TRUE)) 
#[1] "Owner 1" "Owner 2" "Owner 3" "Owner 4" "Owner 5" "Owner 6" 
+0

ありがとう!特に 'pmax'関数は私のためにうまくいきます。私はあなたのアプローチがベクトルベースでループが必要ないのが好きです。ただ1つの質問 - 最初の有効な結果が得られ、** left **から** right **、または? – deca

+0

@Martin - 常に最大値をとります。だから2ビート1、 "b"ビート "a"、 "NA"は常に有効な値に失われます。 – thelatemail

0
doLookup <- function(x){ 
    for(i in 2:5){ 
    if(!is.na(x[i])) 
     return(x[i]) 
    } 
    return(NA) 
} 

#loop through each record and make assignment 
for(j in 1:nrow(df)) 
    df[j,6] <- doLookup(df[j,]) 
df 
    firmname ownermatch_a1 ownermatch_a2 ownermatch_a3 ownermatch_b1 ownerfinal 
1 Firm A  Owner 1  Owner 1  Owner 1  Owner 1 Owner 1 
2 Firm B   <NA>   <NA>   <NA>  Owner 2 Owner 2 
3 Firm C   <NA>   <NA>  Owner 3  Owner 3 Owner 3 
4 Firm D   <NA>  Owner 4  Owner 4  Owner 4 Owner 4 
5 Firm E  Owner 5  Owner 5  Owner 5  Owner 5 Owner 5 
6 Firm F  Owner 6  Owner 6  Owner 6  Owner 6 Owner 6 
関連する問題