gpt4 book ai didi

r - 填充空白行取决于上一个/下一个非空值

转载 作者:行者123 更新时间:2023-12-05 02:20:34 24 4
gpt4 key购买 nike

我有一个订阅数据框,如下所示。大约有 100 万个唯一 ID。该表列出了订阅状态。当用户开始订阅服务时,状态字段由'Sub'指示,当用户取消订阅时,它由'Usub'指示。

dat <- data.frame(ID=c(rep("A",12),(rep("B",12))), Year="2014", Month=rep(seq(1:12),2), Status=NA)
dat$Status[4] <- "Sub"
dat$Status[8] <- "Usub"
dat$Status[17] <- "Usub"
dat$Status[21] <- "Sub"

ID Year Month Status
A 2014 1
A 2014 2
A 2014 3
A 2014 4 Sub
A 2014 5
A 2014 6
A 2014 7
A 2014 8 Usub
A 2014 9
A 2014 10
A 2014 11
A 2014 12
B 2014 1
B 2014 2
B 2014 3
B 2014 4
B 2014 5 Usub
B 2014 6
B 2014 7
B 2014 8
B 2014 9 Sub
B 2014 10
B 2014 11
B 2014 12
C 2014 1 .
. . . .
. . . .

我希望填补每次状态更新之间的空白。所需的输出表如下所示:

ID Year Month Status
A 2014 1 Usub
A 2014 2 Usub
A 2014 3 Usub
A 2014 4 Sub
A 2014 5 Sub
A 2014 6 Sub
A 2014 7 Sub
A 2014 8 Usub
A 2014 9 Usub
A 2014 10 Usub
A 2014 11 Usub
A 2014 12 Usub
B 2014 1 Sub
B 2014 2 Sub
B 2014 3 Sub
B 2014 4 Sub
B 2014 5 Usub
B 2014 6 Usub
B 2014 7 Usub
B 2014 8 Usub
B 2014 9 Sub
B 2014 10 Sub
B 2014 11 Sub
B 2014 12 Sub
C 2014 1 .
. . . .
. . . .

每个 ID 至少有一个状态值。如果一个ID的第一个状态记录是“Usub”,那么之前所有月份的状态都是“Sub”。 (如ID B on 2014/05)相反,如果第一个状态记录以“Sub”开头,则之前所有月份的状态都是“Usub”

最佳答案

您可以通过减去 Status == "Usub"Status = "Sub" 生成一个交替序列,该序列等效于您想要的 Status 列应该用 Sub 填充的值会比应该用 Usub 填充的值低,然后利用 factor 可以按顺序标记的事实来转换整数序列到一个因子:

library(dplyr)
df %>% group_by(ID) %>% mutate(Status = factor(cumsum((Status == "Usub") - (Status == "Sub")),
labels = c("Sub", "Usub")))

# ID Year Month Status
# 1 A 2014 1 Usub
# 2 A 2014 2 Usub
# 3 A 2014 3 Usub
# 4 A 2014 4 Sub
# 5 A 2014 5 Sub
# 6 A 2014 6 Sub
# 7 A 2014 7 Sub
# 8 A 2014 8 Usub
# 9 A 2014 9 Usub
# 10 A 2014 10 Usub
# 11 A 2014 11 Usub
# 12 A 2014 12 Usub
# 13 B 2014 1 Sub
# 14 B 2014 2 Sub
# 15 B 2014 3 Sub
# 16 B 2014 4 Sub
# 17 B 2014 5 Usub
# 18 B 2014 6 Usub
# 19 B 2014 7 Usub
# 20 B 2014 8 Usub
# 21 B 2014 9 Sub
# 22 B 2014 10 Sub
# 23 B 2014 11 Sub
# 24 B 2014 12 Sub

相应的data.table 方式是:

library(data.table)
setDT(df)[, Status := as.character(factor(cumsum((Status == "Usub") - (Status == "Sub")), labels = c("Sub", "Usub"))), .(ID)]

您必须将新因子转换回字符类,因为它不允许在就地创建新列时更改类型。

数据假定您有空字符串而不是 NA:

structure(list(ID = c("A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B",
"B", "B", "B"), Year = c("2014", "2014", "2014", "2014", "2014",
"2014", "2014", "2014", "2014", "2014", "2014", "2014", "2014",
"2014", "2014", "2014", "2014", "2014", "2014", "2014", "2014",
"2014", "2014", "2014"), Month = c("1", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "11", "12", "1", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "11", "12"), Status = c("", "", "", "Sub",
"", "", "", "Usub", "", "", "", "", "", "", "", "", "Usub", "",
"", "", "Sub", "", "", "")), .Names = c("ID", "Year", "Month",
"Status"), row.names = c(NA, 24L), class = "data.frame")

关于r - 填充空白行取决于上一个/下一个非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38532261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com