Присвояване на вектор към по-дълъг вектор по група

Мъчих се да присвоя стойности на някои групи в някои данни, но донякъде съм заседнал. Опитвал съм 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