【问题标题】:mutate variable by condition using two variables in long format data.table in r使用r中的长格式data.table中的两个变量按条件改变变量
【发布时间】:2022-01-11 19:01:18
【问题描述】:

在这个data.table中:

dt <- data.table(id=c(1,1,1,2,2,2), time=rep(1:3,2), x=c(1,0,0,0,1,0))
dt
   id time x
1:  1    1 1
2:  1    2 0
3:  1    3 0
4:  2    1 0
5:  2    2 1
6:  2    3 0

我需要以下物品:

   id time x
1:  1    1 1
2:  1    2 1
3:  1    3 1
4:  2    1 0
5:  2    2 1
6:  2    3 1

那是

  1. 如果 x==1 time==1 然后 x=1 在时间 2 和 3,id
  2. 如果x==1time==2 然后x=1 在时间3,id

对于第一点(我想第二点会类似),我已经尝试过我之前发布的类似问题(herehere)中提到的方法,但没有任何工作:

  • dt[x==1[time == 1], x := x[time == 1], id] 报错
  • setDT(dt)[, x2:= ifelse(x==1 &amp; time==1, x[time==1], x), by=id] 仅在 time 1 处更改 x(因此,没有观察到真正的变化)

使用宽格式的 data.table 会容易得多,但我一直面临长格式的这种问题,我不想一直重塑我的数据

谢谢!

编辑:

@GregorThomas dt[, x := cummax(x), by = id] 提供的答案适用于我提出的问题。

现在我对字符变量提出同样的问题:

dt2 <- data.table(id=c(1,1,1,2,2,2), time=rep(1:3,2), x=c('a','b','b','b','a','b'))
dt2
   id time x
1:  1    1 a
2:  1    2 b
3:  1    3 b
4:  2    1 b
5:  2    2 a
6:  2    3 b

在上表中,如何做到以下几点:

  1. 如果 x=='a'time==1 然后 x='a' 在时间 2 和 3,按 ID
  2. 如果 x=='a'time==2 然后 x='a' 在时间 3,通过 id

【问题讨论】:

    标签: r data.table long-format-data


    【解决方案1】:

    使用累积最大值函数cummax

    dt[, x := cummax(x), by = id]
    dt
    # id time x
    # 1:  1    1 1
    # 2:  1    2 1
    # 3:  1    3 1
    # 4:  2    1 0
    # 5:  2    2 1
    # 6:  2    3 1
    

    【讨论】:

    • 谢谢@GregorThomas 和@GuedesBF,这行得通!但是如果x 是一个字符,这个选项就不可能了。你不知道在那种情况下可以做什么吗?
    • 您提供了带有数字列的示例数据。请编辑您的问题以包含文本数据的代表
    • 在其他情况下,我可能会使用cumsum 来触发条件,例如x := fifelse(cumsum(x == "A") &gt; 1, "A", x))。试图概括一下......
    猜你喜欢
    • 2020-11-27
    • 2021-07-26
    • 1970-01-01
    • 2015-02-07
    • 2019-09-05
    • 2020-08-18
    • 1970-01-01
    • 2015-06-19
    • 2019-12-29
    相关资源
    最近更新 更多