假设我有以下数据框:
i grp val
1 x 900
2 x 800
3 x 700
1 y 500
2 y 400
3 y 300
现在,我想在数据框中添加一个额外的列,该列为同一grp
内的所有行存储相同的值。更确切地说,该值应该val
取自i == 2
的相应组的行。
i grp val val_of_2
1 x 900 800
2 x 800 800
3 x 700 800
1 y 500 400
2 y 400 400
3 y 300 400
我想到了ddply(df, "grp", transform, val_of_2 = <select val where i == 2>)
之类的东西。但是,到目前为止,我还没有提出有效的配方。
答案 0 :(得分:2)
ave(df$val * (df$i == 2), df$grp, FUN = max)
#[1] 800 800 800 400 400 400
答案 1 :(得分:2)
ddply
的语法是
plyr::ddply(df, "grp", transform, val_of_2 = val[i==2])
或使用dplyr
library(dplyr)
df %>%
group_by(grp) %>%
mutate(val_of_2 = val[i==2])
# A tibble: 6 x 4
# Groups: grp [2]
# i grp val val_of_2
# <int> <chr> <int> <int>
#1 1 x 900 800
#2 2 x 800 800
#3 3 x 700 800
#4 1 y 500 400
#5 2 y 400 400
#6 3 y 300 400
答案 2 :(得分:0)
也许你是SQL连接逻辑的粉丝:
library(tidyverse)
df <- frame_data(
~i, ~grp, ~val,
1, "x", 900,
2, "x", 800,
3, "x", 700,
1, "y", 500,
2, "y", 400,
3, "y", 300
)
df %>%
left_join(
df %>%
filter(i == 2) %>%
select(grp, val)
, by = "grp")