通过删除一些 NA 单元来压缩数据框?

Compact a data frame by removing some of the NA cells?

如果我有如下数据框:

data.frame(
  cola = c(3,NA,NA),
  colb = c(1,NA,NA),
  colc = c(NA,6,NA),
  cold = c(NA,7,NA),
  cole = c(NA,3,NA),
  colf = c(NA,NA,9), 
  colg = c(NA,NA,8)
)

如何将所有字段向左移动,根据需要消除 NA 值,如下所示:

data.frame(
  cola = c(3,6,9),
  colb = c(1,7,8),
  colc = c(NA,3,NA)
)

感谢您的帮助。

我们遍历行,用na.omit删除NA元素,然后根据list[=的最大长度在末尾追加NA 15=]

lst <- apply(df1, 1, na.omit)
out <- as.data.frame(do.call(rbind, lapply(lst, `length<-`, max(lengths(lst)))))

另一个选项可以是:

library(tidyverse)

df %>% rownames_to_column() %>%
    gather(measure, value, -rowname) %>%
    group_by(rowname) %>%
    na.omit() %>%
    mutate(measure = paste0("col", row_number())) %>%
    spread(measure, value) %>%
    ungroup() %>%
    select(-rowname)
#    col1  col2  col3
# 1     3     1    NA
# 2     6     7     3
# 3     9     8    NA

您可以转置、删除 NA、转回:

library(magrittr)
library(data.table)

DF %>% transpose %>% lapply(na.omit) %>% transpose %>% 
  data.frame %>% setNames(names(DF)[seq_along(.)])

  cola colb colc
1    3    1   NA
2    6    7    3
3    9    8   NA