删除NA值并将非NA值合并到单个列中

时间:2019-05-03 17:58:27

标签: r na

我有一个数据集,在所有列中都有数字和NA值。我想用所有非NA值创建一个新列,并保留行名

    v1  v2  v3  v4  v5
a   1   NA  NA  NA  NA 
b   NA  2   NA  NA  NA
c   NA  NA  3   NA  NA
d   NA  NA  NA  4   NA
e   NA  NA  NA  NA  5

我尝试使用dplyr的合并功能

digital_metrics_FB <- fb_all_data %>%
                      mutate(fb_metrics = coalesce("v1", 
                                                   "v2", 
                                                   "v3", 
                                                   "v4",
                                                   "v5")) 

并尝试了Apply函数

df2 <- sapply(fb_all_data,function(x) x[!is.na(x)])

仍然无法使其正常工作。

我正在寻找最终结果,使所有非NA值都出现在最后一列中,并且保留行名

    final  
 a    1
 b    2
 c    3
 d    4
 e    5

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

我们可以使用pmax

do.call(pmax, c(fb_all_data , na.rm = TRUE))

如果有多个以上的非NA元素并且想要组合为一个字符串,则简单的base R选项就是

data.frame(final = apply(fb_all_data, 1, function(x) toString(x[!is.na(x)])))

或使用coalesce

library(dplyr)
library(tibble)
fb_all_data  %>%
   rownames_to_column('rn') %>%
   transmute(rn, final = coalesce(v1, v2, v3, v4, v5)) %>%
   column_to_rownames('rn')
#   final
#a     1
#b     2
#c     3
#d     4
#e     5

或对多个非NA元素使用tidyverse

fb_all_data %>%
      rownames_to_column('rn') %>%
      transmute(rn, final = pmap_chr(.[-1], ~ c(...) %>% 
                                 na.omit %>%
                                 toString)) %>%
      column_to_rownames('rn')

注意:这里我们以OP为例显示数据,而不是其他一些数据集

数据

fb_all_data <- structure(list(v1 = c(1L, NA, NA, NA, NA), v2 = c(NA, 2L, NA, 
 NA, NA), v3 = c(NA, NA, 3L, NA, NA), v4 = c(NA, NA, NA, 4L, NA
  ), v5 = c(NA, NA, NA, NA, 5L)), class = "data.frame",
  row.names = c("a", 
 "b", "c", "d", "e"))

答案 1 :(得分:1)

使用tidyverse,您可以执行以下操作:

df %>%
 rownames_to_column() %>%
 gather(var, val, -1, na.rm = TRUE) %>%
 group_by(rowname) %>%
 summarise(val = paste(val, collapse = ", "))

  rowname val  
  <chr>   <chr>
1 a       1    
2 b       2, 3 
3 c       3    
4 d       4    
5 e       5 

将数据采样到具有多个非NA值的行:

df <- read.table(text = "    v1  v2  v3  v4  v5
a   1   NA  NA  NA  NA 
                 b   NA  2   3  NA  NA
                 c   NA  NA  3   NA  NA
                 d   NA  NA  NA  4   NA
                 e   NA  NA  NA  NA  5", header = TRUE)