Назначить вектор более длинному вектору по группе

Я изо всех сил пытался присвоить значения некоторым группам в некоторых данных, но я несколько застрял. Я пробовал match использовать unique, rep и другие. Я надеюсь, что кто-то здесь может мне помочь.

У меня есть набор данных, который выглядит так

df <- data.frame(
GRP.id  = c(1, 2, 2, 2, 3, 3),
group  = c("A", "B", "B", "B", "C", "C"))
> df
  GRP.id group
1      1     A
2      2     B
3      2     B
4      2     B
5      3     C
6      3     C

и вектор с некоторыми значениями, которые необходимо присвоить каждой группе

value <- c(.3, .8, .3)

так что я получаю этот результат

  GRP.id group value
1      1     A   0.3
2      2     B   0.8
3      2     B   0.8
4      2     B   0.8
5      3     C   0.3
6      3     C   0.3

person Eric Fail    schedule 04.04.2016    source источник


Ответы (1)


df$value <- value[match(df$GRP.id,unique(df$GRP.id))];
df;
##   GRP.id group value
## 1      1     A   0.3
## 2      2     B   0.8
## 3      2     B   0.8
## 4      2     B   0.8
## 5      3     C   0.3
## 6      3     C   0.3

Если вы точно знаете, что столбец df$GRP.id всегда будет состоять из 1:n для некоторого максимального n, то вы можете заменить часть match(df$GRP.id,unique(df$GRP.id)) только на df$GRP.id. Но для надежности (то есть на тот случай, если это предположение не всегда будет верным) я бы выбрал дизайн match()/unique().

person bgoldst    schedule 04.04.2016
comment
Очень красивый ответ. Спасибо за добавленный комментарий о надежности. Могу я спросить, почему вы заканчиваете свои строки на ;? - person Eric Fail; 04.04.2016
comment
@EricFail Спасибо :) См. stackoverflow.com/a/29004774/4272464 мой стандартный ответ о точках с запятой. - person bgoldst; 04.04.2016