цикл для создания новой переменной на основе других случаев в R (очень простой) - PullRequest
3 голосов
/ 08 мая 2011

У меня есть фрейм данных с тремя переменными: ID, group и nominated_ID.Я хочу знать group, к которому принадлежит nominated_ID.

Я представляю, что для каждого случая мы берем nominated_ID, находим случай, когда он равен ID, а затемустановите переменную nominated_Group в исходном регистре равной переменной group в сопоставленном регистре.(Если совпадения нет, установите для него значение NA)

Я не удивлюсь, если это можно будет сделать без цикла, поэтому я непредубежден в отношении решения.Большое спасибо за Вашу помощь.Знайте, что я пытался найти похожие вопросы, прежде чем писать.

Ответы [ 4 ]

4 голосов
/ 08 мая 2011

Вы можете достичь этого за один шаг без использования cbind, непосредственно разместив результаты в столбце в вашем файле данных.в столбцы df без необходимости многократно писать df$.

3 голосов
/ 08 мая 2011

Вы можете сделать это синтаксически компактно, используя transform, match и индексирование массива. Использование фрейма @ Генри:

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
3 голосов
/ 08 мая 2011

Следующее похоже на работу; могут быть лучшие способы

> 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
2 голосов
/ 08 мая 2011

Вероятно, не самый «интуитивный» способ, но объединение df против df также работает, если вы используете nominated_ID в качестве индекса слияния для первой копии и ID в качестве индекса для второй и сохраняете все строки. нужно убрать вторую колонку nominated_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
...