簡體   English   中英

R:合並忽略NA的列

[英]R: Combine columns ignoring NAs

我有一個包含幾列的數據框,其中對於每一行,只有一列可以具有非NA值。 我想將各列合並為一個,僅保留非NA值,類似於此文章:

合並列以刪除NA

但是,就我而言,某些行可能僅包含NA,因此在合並的列中,我們應保留一個NA,如下所示(改編自我提到的文章):

data <- data.frame('a' = c('A','B','C','D','E','F'),
                   'x' = c(1,2,NA,NA,NA,NA),
                   'y' = c(NA,NA,3,NA,NA,NA),
                   'z' = c(NA,NA,NA,4,5,NA))

所以我會

  a  x  y  z
1 A  1 NA NA
2 B  2 NA NA
3 C NA  3 NA
4 D NA NA  4
5 E NA NA  5
6 F NA NA NA

我會得到

 'a' 'mycol'  
  A   1  
  B   2  
  C   3  
  D   4  
  E   5  
  F   NA

由於F行,上述帖子中的解決方案在我的情況下不起作用,原因是:

cbind(data[1], mycol = na.omit(unlist(data[-1])))

謝謝!

一種選擇是從dplyr coalesce

library(tidyverse)
data %>% 
   transmute(a, mycol = coalesce(!!! rlang::syms(names(.)[-1])))
#    a mycol
#1 A     1
#2 B     2
#3 C     3
#4 D     4
#5 E     5
#6 F    NA

或者我們可以使用base R max.col

cbind(data[1], mycol= data[-1][cbind(1:nrow(data), 
       max.col(!is.na(data[-1])) * NA^!rowSums(!is.na(data[-1]))+1)])
#   a mycol
#1 A     1
#2 B     2
#3 C     3
#4 D     4
#5 E     5
#6 F    NA

或僅與rowSums

v1 <- rowSums(data[-1], na.rm = TRUE)
cbind(data[1], mycol = v1 * NA^!v1)

或另一個選擇是pmax

cbind(data[1], mycol = do.call(pmax, c(data[-1], na.rm = TRUE)))

pmin

cbind(data[1], mycol = do.call(pmin, c(data[-1], na.rm = TRUE)))

使用基本R ...

data$mycol <- apply(data[,2:4], 1, function(x) x[!is.na(x)][1])

data
  a  x  y  z mycol
1 A  1 NA NA     1
2 B  2 NA NA     2
3 C NA  3 NA     3
4 D NA NA  4     4
5 E NA NA  5     5
6 F NA NA NA    NA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM