根据列中的条件将值分配给组

Bou*_*man 10 r data-manipulation

我有一个如下所示的数据框:

> df = data.frame(group = c(1,1,1,2,2,2,3,3,3), 
                 date = c(1,2,3,4,5,6,7,8,9),
                 value = c(3,4,3,4,5,6,6,4,9))
> df
  group date value
1     1    1     3
2     1    2     4
3     1    3     3
4     2    4     4
5     2    5     5
6     2    6     6
7     3    7     6
8     3    8     4
9     3    9     9
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列,其中包含与值列中的值"4"关联的每个组的日期值.

以下数据框显示了我希望实现的目标.

  group date value newValue
1     1    1     3        2
2     1    2     4        2
3     1    3     3        2
4     2    4     4        4
5     2    5     5        4
6     2    6     6        4
7     3    7     6        8
8     3    8     4        8
9     3    9     9        8
Run Code Online (Sandbox Code Playgroud)

我们可以看到,组1具有newValue"2",因为这是与值"4"相关联的日期.同样,第二组有newValue4个,第三组有newValue8个.

我假设有一种简单的方法可以使用ave()或者使用一系列dplyr/ data.table函数,但是我的尝试并没有成功.

Dav*_*urg 15

这里有一个快速data.table一个

library(data.table)
setDT(df)[, newValue := date[value == 4L], by = group]
df
#    group date value newValue
# 1:     1    1     3        2
# 2:     1    2     4        2
# 3:     1    3     3        2
# 4:     2    4     4        4
# 5:     2    5     5        4
# 6:     2    6     6        4
# 7:     3    7     6        8
# 8:     3    8     4        8
# 9:     3    9     9        8
Run Code Online (Sandbox Code Playgroud)

这是一个类似的dplyr版本

library(dplyr)
df %>%
  group_by(group) %>%
  mutate(newValue = date[value == 4L])
Run Code Online (Sandbox Code Playgroud)

或者merge在过滤数据后使用可能的基本R解决方案(之后需要重命名)

merge(df, df[df$value == 4, c("group", "date")], by = "group")
Run Code Online (Sandbox Code Playgroud)