根据以前的值更新列值(一次处理总是处理)
Updating column values based on previous values (once treated always treated)
我想知道是否有使用数据的更快方法。table/dplyr 根据以前的值按组替换值。
假设我的原始数据 table 看起来像:
DT_orig <- data.table(name = c("A", "A", "A", "B", "B", "B"),
year = c("2001", "2002", "2003", "2001", "2002", "2003"),
treat = c(1,0,0, 0,0,1))
看起来如下:
name year treat
1: A 2001 1
2: A 2002 0
3: A 2003 0
4: B 2001 0
5: B 2002 0
6: B 2003 1
在这里,对于每个人(姓名)和时间段(年),有一列(治疗),表示他们是否已被分配治疗。
我正在考虑一种替代疗法,即一旦某个人接受了治疗,该人就会继续接受治疗。因此,修改后的数据 table 应该如下所示:
name year treat
1: A 2001 1
2: A 2002 1
3: A 2003 1
4: B 2001 0
5: B 2002 0
6: B 2003 1
请注意,对于 A 来说,在 2001 年接受治疗意味着他们在接下来的几年中也是 "treated"。
因为我有一个非常大的数据table,我想知道是否有一种非常快速的修改方法来实现这一点。
也许我们可以使用 cummax
(来自 base R
)
DT_orig[, treat := cummax(treat), name]
DT_orig
# name year treat
#1: A 2001 1
#2: A 2002 1
#3: A 2003 1
#4: B 2001 0
#5: B 2002 0
#6: B 2003 1
或者用 dplyr
也可以做同样的事情
library(dplyr)
DT_orig %>%
group_by(name) %>%
mutate(treat = cummax(treat))
或使用base R
DT_orig$treat <- with(DT_orig, ave(treat, name, FUN = cummax))
我会使用 cummax()
但这里有一个替代方法来说明 data.table
的连接语法:
DT_orig[, year := as.integer(year)]
DT_orig[DT_orig[treat == 1], on = .(year >= year, name), treat := 1L]
name year treat
1: A 2001 1
2: A 2002 1
3: A 2003 1
4: B 2001 0
5: B 2002 0
6: B 2003 1
我想知道是否有使用数据的更快方法。table/dplyr 根据以前的值按组替换值。
假设我的原始数据 table 看起来像:
DT_orig <- data.table(name = c("A", "A", "A", "B", "B", "B"),
year = c("2001", "2002", "2003", "2001", "2002", "2003"),
treat = c(1,0,0, 0,0,1))
看起来如下:
name year treat
1: A 2001 1
2: A 2002 0
3: A 2003 0
4: B 2001 0
5: B 2002 0
6: B 2003 1
在这里,对于每个人(姓名)和时间段(年),有一列(治疗),表示他们是否已被分配治疗。
我正在考虑一种替代疗法,即一旦某个人接受了治疗,该人就会继续接受治疗。因此,修改后的数据 table 应该如下所示:
name year treat
1: A 2001 1
2: A 2002 1
3: A 2003 1
4: B 2001 0
5: B 2002 0
6: B 2003 1
请注意,对于 A 来说,在 2001 年接受治疗意味着他们在接下来的几年中也是 "treated"。
因为我有一个非常大的数据table,我想知道是否有一种非常快速的修改方法来实现这一点。
也许我们可以使用 cummax
(来自 base R
)
DT_orig[, treat := cummax(treat), name]
DT_orig
# name year treat
#1: A 2001 1
#2: A 2002 1
#3: A 2003 1
#4: B 2001 0
#5: B 2002 0
#6: B 2003 1
或者用 dplyr
library(dplyr)
DT_orig %>%
group_by(name) %>%
mutate(treat = cummax(treat))
或使用base R
DT_orig$treat <- with(DT_orig, ave(treat, name, FUN = cummax))
我会使用 cummax()
但这里有一个替代方法来说明 data.table
的连接语法:
DT_orig[, year := as.integer(year)]
DT_orig[DT_orig[treat == 1], on = .(year >= year, name), treat := 1L]
name year treat
1: A 2001 1
2: A 2002 1
3: A 2003 1
4: B 2001 0
5: B 2002 0
6: B 2003 1