使用r中的长格式data.table中的两个变量按条件改变变量

Posted

技术标签:

【中文标题】使用r中的长格式data.table中的两个变量按条件改变变量【英文标题】:mutate variable by condition using two variables in long format data.table in r 【发布时间】: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

那是

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

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

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

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

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

【问题讨论】:

【参考方案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))。试图概括一下......

以上是关于使用r中的长格式data.table中的两个变量按条件改变变量的主要内容,如果未能解决你的问题,请参考以下文章

如何按 data.table 中的十分位组计算统计信息

如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象

在 R data.table 中创建虚拟变量

如何计算 R 中 data.table 中的出现组合

如果名称按组的顺序不同,R data.table 分组操作返回错误值?

如何使用 R 交换 data.table 中的列值