R 创建等于查找值的新变量

R 创建等于查找值的新变量,r,R,我有一个数据集: > d <- seq.Date(as.Date("2017/01/01"), as.Date("2017/03/01"), by = "month") > df <- data.frame(x1 = d, x2 = rev(d), x3 = 1:3) > df x1 x2 x3 1 2017-01-01 2017-03-01 1 2 2017-02-01 2017-02-01 2 3 2017-03-01 2

我有一个数据集:

> d <- seq.Date(as.Date("2017/01/01"), as.Date("2017/03/01"), by = "month")
> df <- data.frame(x1 = d, x2 = rev(d), x3 = 1:3)
> df
       x1         x2    x3
1 2017-01-01 2017-03-01  1
2 2017-02-01 2017-02-01  2
3 2017-03-01 2017-01-01  3

有没有一种更有效或更具可读性的方法

我们可以使用
dplyr

dplyr::mutate(df, x4 = max(x3[x1 == x2]))

如果我们寻找一个有效的解决方案,那么我们可以使用
data.table
分配

library(data.table)
setDT(df)[x1 == x2, x4 := max(x3) ]
df
#           x1         x2 x3 x4
#1: 2017-01-01 2017-03-01  1 NA
#2: 2017-02-01 2017-02-01  2  2
#3: 2017-03-01 2017-01-01  3 NA
如果我们不需要
NA
值,它是

setDT(df)[, x4 := max(x3[x1==x2])]
df
#           x1         x2 x3 x4
#1: 2017-01-01 2017-03-01  1  2
#2: 2017-02-01 2017-02-01  2  2
#3: 2017-03-01 2017-01-01  3  2

我不理解期望输出的逻辑。既然
x1!=x2
对于第1行和第3行?不,我正在尝试将2月份的X3值复制到X4的所有值。这不就是变异(X4=X3[x1=x2])?是的,回答很好。谢谢。这里需要max()吗?我想这要看情况而定。由于x3可能有多个值,其中x1==x2,因此您必须决定是否需要最大值。
setDT(df)[, x4 := max(x3[x1==x2])]
df
#           x1         x2 x3 x4
#1: 2017-01-01 2017-03-01  1  2
#2: 2017-02-01 2017-02-01  2  2
#3: 2017-03-01 2017-01-01  3  2