首页 > 解决方案 > R动态地将具有NA的多列合并为一列

问题描述

有没有办法动态合并具有 NA 值的列?

tibble(
  x = c(1:2, NA, NA, NA, NA, NA),
  y = c(NA, NA, 4:7, NA),
  z = c(NA, NA, NA, NA, NA, NA, 9)
)

# A tibble: 7 x 3
      x     y     z
  <int> <int> <dbl>
1     1    NA    NA
2     2    NA    NA
3    NA     4    NA
4    NA     5    NA
5    NA     6    NA
6    NA     7    NA
7    NA    NA     9

预计:

# A tibble: 7 x 3
      x     y     z
  <int> <int> <dbl>
1     1    NA    NA
2     2    NA    NA
3     4     4    NA
4     5     5    NA
5     6     6    NA
6     7     7    NA
7     9    NA     9

此示例是从 xlsx 文件中读取的,因此在某些情况下该列yz可能不存在

标签: rdataframedplyr

解决方案


在 Ronak 的帮助下更新。请参阅评论:现在它应该适用于具有不同列的 df:更通用的解决coalesce方案do.call

library(dplyr)
df <- tibble(
  x = c(1:2, NA, NA, NA, NA, NA),
  y = c(NA, NA, 4:7, NA)
)

df %>%
  mutate(result = do.call(coalesce, df))

输出:

      x     y result
  <int> <int>  <int>
1     1    NA      1
2     2    NA      2
3    NA     4      4
4    NA     5      5
5    NA     6      6
6    NA     7      7
7    NA    NA     NA

第一个答案 这是coalescefrom dplyrpackage 的工作:在每个位置找到第一个非缺失值。

library(dplyr)
df %>% mutate(result = coalesce(x,y,z))

输出:

      x     y     z result
  <int> <int> <dbl>  <dbl>
1     1    NA    NA      1
2     2    NA    NA      2
3    NA     4    NA      4
4    NA     5    NA      5
5    NA     6    NA      6
6    NA     7    NA      7
7    NA    NA     9      9

推荐阅读