我有一个数据集:
> 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
我想创建一个新变量x4,当x1 == x2时,它等于x3。
到目前为止,这是我拥有的最佳解决方案,这有点神秘。
> library(dplyr)
> df %>% mutate(x4 = max( x3 * (x1 == x2) ) )
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
那里有更高效或更易读的方法吗?
答案 0 :(得分:2)
如果我们寻找有效的解决方案,那么我们就可以使用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
答案 1 :(得分:1)
我们可以使用dplyr
:
dplyr::mutate(df, x4 = max(x3[x1 == x2]))