【问题标题】:Create new variable equal to lookup value创建等于查找值的新变量
【发布时间】:2018-03-11 10:58:54
【问题描述】:

我有一个数据集:

> 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

有没有更有效或更易读的方法?

【问题讨论】:

  • 我不明白所需输出的逻辑。 x4 的第 2 行不应该是 2 和其他所有 NA,因为 x1 != x2 对于第 1 行和第 3 行?
  • 不,我正在尝试将 2 月份 X3 的值复制到 X4 的所有值。
  • 这不是df %&gt;% mutate(x4 = x3[x1 == x2])吗?
  • 是的,很好的答案。

标签: r


【解决方案1】:

如果我们寻找一个有效的解决方案,那么我们可以使用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

【讨论】:

    【解决方案2】:

    我们可以使用dplyr:

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

    【讨论】:

    • 谢谢。这里需要 max() 吗?
    • 我认为这取决于。由于 x3 可能有多个值,其中 x1 == x2 您必须决定是否需要最大值。
    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2020-08-24
    • 2018-06-05
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多