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