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

remove NA values and combine non NA values into a single column

我有一个数据集,它的所有列都有数值和 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 的 coalesce 函数

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

并且还尝试了一个应用函数

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

仍然无法正常工作。

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

    final  
 a    1
 b    2
 c    3
 d    4
 e    5

任何帮助将不胜感激

我们可以使用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

或使用 tidyverse,用于多个非 NA 元素

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

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