在列中向上移动行并刷新剩余的行

时间:2017-12-22 18:02:51

标签: r dplyr tidyr

将行移到上一行时遇到问题。当行变为完全NA时,我想冲洗这些行(参见下面的图片)。我目前的解决方案仍然是第二行。

这是我的方法

  data <- data.frame(gr=c(rep(1:3,each=2)),A=c(1,NA,2,NA,4,NA), B=c(NA,1,NA,3,NA,7),C=c(1,NA,4,NA,5,NA))

> data
  gr  A  B  C
1  1  1 NA  1
2  1 NA  1 NA
3  2  2 NA  4
4  2 NA  3 NA
5  3  4 NA  5
6  3 NA  7 NA

enter image description here

所以使用this方法

data.frame(apply(data,2,function(x){x[complete.cases(x)]}))

  gr A B C
1  1 1 1 1
2  1 2 3 4
3  2 4 7 5
4  2 1 1 1
5  3 2 3 4
6  3 4 7 5

我们仍然可以看到我在每组中都有第二行!

预期输出

> data
      gr  A  B  C
    1  1  1  1  1
    2  2  2  3  4
    3  3  4  7  5

谢谢!

3 个答案:

答案 0 :(得分:1)

如果每个gr最多只有一个有效值,您可以使用na.omit然后从中获取第一个值:

data %>% group_by(gr) %>% summarise_all(~ na.omit(.)[1])
# [1] is optional depending on your actual data

# A tibble: 3 x 4
#     gr     A     B     C
#  <int> <dbl> <dbl> <dbl>
#1     1     1     1     1
#2     2     2     3     4
#3     3     4     7     5

答案 1 :(得分:1)

您可以使用dplyr这样做:

data$ind <- rep(c(1,2), replace=TRUE)

data %>% fill(A,B,C) %>% filter(ind == 2) %>% mutate(ind=NULL)

  gr A B C
1  1 1 1 1
2  2 2 3 4
3  3 4 7 5

根据您的完整数据的一致性,可能需要进行调整。

答案 2 :(得分:0)

使用data.table的另一个解决方案: -

data <- data.frame(gr=c(rep(1:3,each=2)),A=c(1,NA,2,NA,4,NA), B=c(NA,1,NA,3,NA,7),C=c(1,NA,4,NA,5,NA))

library(data.table)
library(zoo)
setDT(data)
data[, A := na.locf(A), by = gr]
data[, B := na.locf(B), by = gr]
data[, C := na.locf(C), by = gr]
data <- unique(data)
data




 gr A B C
1:  1 1 1 1
2:  2 2 3 4
3:  3 4 7 5