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"相关联的日期.同样,第二组有newValue
4个,第三组有newValue
8个.
我假设有一种简单的方法可以使用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)