我有以下数据集,其中包含两列c1和c2:
"c1""c2"
1 NA
1 NA
1 NA
1 Low
2 NA
2 NA
2 High
3 Low
3 NA
3 NA
3 High
4 NA
4 High
4 NA
4 Low
我想要的是,基于第一列呈现不同的参与者(同一参与者=相同的数字):
删除所有NAs,直到第一个非NA
在第一个非NA之后,将该值复制到所有后续参与者行并覆盖任何NA,直到下一个参与者出现
我的输出是:
1 Low
2 High
3 Low
3 Low
3 Low
3 Low
4 High
4 High
4 High
这有意义吗?如果是的话,如果不使用for循环,我该怎么办?感谢您的帮助,我也不确定这个标题是否合适。 问候!
答案 0 :(得分:0)
我们可以尝试使用data.table
。转换' data.frame'到' data.table' (setDT(df1)
),按' c1'分组,我们得到' c2'中第一个非NA元素的索引。子集' c2'基于' i1'并复制它。
library(data.table)
setDT(df1)[, {
i1 <- which.max(!is.na(c2))
.(c2 = rep(c2[i1], .N-i1+1))} , by = c1]
# c1 c2
#1: 1 Low
#2: 2 High
#3: 3 Low
#4: 3 Low
#5: 3 Low
#6: 3 Low
#7: 4 High
#8: 4 High
#9: 4 High
df1 <- structure(list(c1 = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L,
3L, 4L, 4L, 4L, 4L), c2 = c(NA, NA, NA, "Low", NA, NA, "High",
"Low", NA, NA, "High", NA, "High", NA, "Low")), .Names = c("c1",
"c2"), class = "data.frame", row.names = c(NA, -15L))