将列添加到每个组具有不同值的数据框

时间:2018-01-22 18:06:31

标签: r dataframe

假设我有以下数据框:

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>)之类的东西。但是,到目前为止,我还没有提出有效的配方。

3 个答案:

答案 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")