【问题标题】:Compact a data frame by removing some of the NA cells?通过删除一些 NA 单元来压缩数据框?
【发布时间】:2019-01-12 19:56:29
【问题描述】:

如果我有如下数据框:

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

感谢您的帮助。

【问题讨论】:

  • 如果你想将字段向左移动,那么它更像是(转置)matrix,而不是data.frame
  • 也许which(!is.na(df), arr.ind = TRUE) 可以带来一些有趣的东西。

标签: r loops dataframe lapply na


【解决方案1】:

我们遍历行,删除带有na.omitNA 元素,然后根据list 的最大长度在末尾附加NA

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

【讨论】:

  • 单线如何:data.frame(t(apply(dfa, 1, function(x) x[!is.na(x)][seq_len(max(rowSums(!is.na(dfa))))])))?
【解决方案2】:

另一个选项可能是:

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

【讨论】:

    【解决方案3】:

    您可以转置、删除 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多