首页 文章

汇总数据帧以沿子集返回非NA值

提问于
浏览
3

希望有人能帮助我一招 . 我在网上找到了类似的问题,但我见过的所有例子都没有完全符合我的要求,也没有在我的数据结构上工作 .

我需要沿数据子集从数据帧中删除NA,并将剩余的NA值压缩为每个数据子集的行 .

例:

#create example data
a <- c(1, 1, 1, 2, 2, 2) #this is the subsetting variable in the example
b <- c(NA, NA, "B", NA, NA, "C") #max 1 non-NA value for each subset
c <- c("A", NA, NA, "A", NA, NA)
d <- c(NA, NA, 1, NA, NA, NA) #some subsets for some columns have all NA values

dat <- as.data.frame(cbind(a, b, c, d)) 

> desired output
  a b c    d
  1 B A    1
  2 C A <NA>

经验法则:1)需要从每列中删除NA值2)沿数据子集循环(上例中的“a”列)3)每个子集的所有列最多具有1个非NA值,但有些列可以具有所有NA值

思路:

  • lapply或dplyr可能有助于循环所有列
    如果可以忽略具有所有行条目的子集列(例如as.data.frame(lapply(dat.admin,na.omit))),则
  • na.omit可能会有所帮助 . 如果某些子集未返回任何非NA值,则将lapply输出返回到数据帧会出现问题
    如果费力地应用于每个单独的列,
  • x [which.min(is.na(x))]有效地实现了这一点

感谢任何帮助将最终作品组合在一起!谢谢!

3 回答

  • 1

    使用 dplyr::summarise_all 可以实现一个解决方案 . a 上的数据需要 group_by .

    library(dplyr)
    
    dat %>%
      group_by(a) %>%
      summarise_all(funs(.[which.min(is.na(.))]))
    # # A tibble: 2 x 4
    #    a      b      c      d     
    #   <fctr> <fctr> <fctr> <fctr>
    # 1   1      B      A      1     
    # 2   2      C      A      <NA>
    
  • 1

    data.tablena.omit 的解决方案

    library(data.table)
    merge(setDT(dat)[,a[1],keyby=a], setDT(dat)[,na.omit(.SD),keyby=a],all.x=TRUE)
    

    我认为合并声明可以改进

  • 1

    不确定这是否是您正在寻找的,但这可能对您有用 . 它至少会复制您正在寻找的小样本输出:

    library(dplyr)
    library(tidyr)
    
    dat %>% 
      filter_at(vars(b:c), any_vars(!is.na(.))) %>% 
      group_by(a) %>% 
      fill(b) %>% 
      fill(c) %>% 
      filter_at(vars(b:c), all_vars(!is.na(.)))
    
    # A tibble: 2 x 4
    # Groups:   a [2]
           a      b      c      d
      <fctr> <fctr> <fctr> <fctr>
    1      1      B      A      1
    2      2      C      A     NA
    

    您也可以只使用 dplyr

    dat %>%
      group_by(a) %>%
      summarise_each(funs(first(.[!is.na(.)])))
    

相关问题