创建等于查找值

时间:2018-03-11 02:35:57

标签: 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 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

那里有更高效或更易读的方法吗?

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]))