3

IDgroup、およびの 3 つの変数を持つデータフレームがありnominated_IDます。groupnominated_ID属する を知りたいです。

それぞれのケースで、 を取りnominated_ID、それが と等しいケースを見つけ、元のケースの変数を一致したケースの変数と等しくID設定すると想像しています。(一致しない場合はNAに設定)nominated_Groupgroup

これがループなしで実行できても驚かないので、解決策についてはオープンマインドです。どうもありがとうございました。投稿する前に、同様の質問を探してみたことを知っておいてください。

4

4 に答える 4

4

cbind結果を data.frame の列に直接割り当てることで、を使用せずに 1 つのステップでこれを実現できます。

df$nominated_group <- with(df, group[match(nominated_ID, ID)])
df
  ID group nominated_ID nominated_group
1  9   Odd            9             Odd
2  5   Odd            8            <NA>
3  2  Even            4            Even
4  4  Even            9             Odd
5  3   Odd            2            Even

with何度も書くことなく df の列を参照する便利な方法として使用しましたdf$

于 2011-05-08T16:58:50.557 に答える
3

以下はうまくいくようです。もっと良い方法があるかもしれません

> df <- data.frame(ID = c(9, 5, 2, 4, 3), 
+                  group = c("Odd", "Odd", "Even", "Even", "Odd"),
+                  nominated_ID = c(9, 8, 4, 9, 2)                 )
> df
  ID group nominated_ID
1  9   Odd            9
2  5   Odd            8
3  2  Even            4
4  4  Even            9
5  3   Odd            2
> nominated_Group <- df[match(df$nominated_ID, df$ID), ]$group
> newDF <- cbind(df, nominated_Group)
> newDF
  ID group nominated_ID nominated_Group
1  9   Odd            9             Odd
2  5   Odd            8            <NA>
3  2  Even            4            Even
4  4  Even            9             Odd
5  3   Odd            2            Even
于 2011-05-08T01:02:24.167 に答える
3

transformmatchおよび配列インデックスを使用して、構文的にコンパクトな方法でこれを行うことができます。@Henryのデータフレームを使用:

df <- transform( df, nominated_group = group[match(nominated_ID, ID)])

> df
  ID group nominated_ID nominated_group
1  9   Odd            9             Odd
2  5   Odd            8            <NA>
3  2  Even            4            Even
4  4  Even            9             Odd
5  3   Odd            2            Even
于 2011-05-08T14:41:58.727 に答える
2

おそらく最も「直感的な」方法ではありませんが、最初のコピーのマージ インデックスとして nominated_ID を使用し、2 番目のコピーの by インデックスとして ID を使用し、すべての行を保持する場合、マージも機能します。2 番目の列を削除しdfて、上記の答えに一致するものを取得するために:dfnominated_ID

merge(df,df, by.x=3, by.y=1, all.x=TRUE)[order(df$nominated_ID), c(2,3, 1, 4)]

  ID group.x nominated_ID group.y
5  4    Even            9     Odd
3  5     Odd            8    <NA>
2  2    Even            4    Even
1  3     Odd            2    Even
4  9     Odd            9     Odd
于 2011-05-08T15:10:11.993 に答える