处理R中的数据帧子集

时间:2016-10-25 05:04:32

标签: r vector

我有以下数据集,其中包含两列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循环,我该怎么办?感谢您的帮助,我也不确定这个标题是否合适。 问候!

1 个答案:

答案 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))