3

1つの列の数値を他の2つの列の数値と一致させようとしています。これは、1つの列のみに一致する場合は問題なく実行できますが、2つの列に拡張する際に問題が発生します。これが私がしていることです:

2つのデータフレーム、df1があります。

number  value
1   
2   
3   
4   
5   

およびdf2:

number_a    number_b    value
3                       3
            1           5  
5                       1 
            4           2
            2           4

私がやりたいのは、列「number」をdf1からdf2の「number_a」またはnumber_b」のいずれかに一致させ、次にdf2の「value」をdf1の「value」に挿入して結果df1を次のように取得することです。

number  value
1           5
2           4
3           3   
4           2
5           1 

私のアプローチは使用することです

df1$value <- df2$value[match(df1$number, df2$number_a)]

また

df1$value <- df2$value[match(df1$number, df2$number_b)]

これは、それぞれdf1を生成します

number  value
1           NA
2           NA
3           3
4           NA
5           1

number  value
1           5
2           4
3           NA
4           2
5           NA

ただし、このアプローチを使用してdf1のすべての「値」列に入力することはできないようです。「number」を「number_a」および「number_b」に一挙に一致させるにはどうすればよいですか。私は試した

df1$value <- df2$value[match(df1$number, df2$number_a:number_b)]

しかし、それはうまくいきませんでした。

ありがとう!

4

2 に答える 2

2

より簡単な解決策:

df2$number <- ifelse(is.na(df2$number_a), df2$number_b, df2$number_a)

ifelseに慣れていない場合は、次の形式のベクトルで機能します。

ifelse(Condition, ValueIfTrue, ValueIfFalse)
于 2013-02-02T18:56:19.987 に答える
1

私はRの初心者です(Cで数年来ています)。提案を試していて、思いついたものを貼り付けようと思いました。

// Assuming either 'number_a' or 'number_b' is valid
// Combine into new column 'number' and delete them original columns

df2 <- transform(df2, number = ifelse(is.na(df2$number_a), df2$number_b, 
       df2$number_a))[-c(1:2)]

// Combine the two data frames by the column 'number'
df <- merge(df1, df2, by = "number")
  数値
       1 5
       2 4
       3 3
       4 2
       5 1
于 2013-02-02T21:49:33.663 に答える