R 如何使用多个其他列中的所有非NA值创建新列?

R 如何使用多个其他列中的所有非NA值创建新列?,r,if-statement,dataframe,conditional,na,R,If Statement,Dataframe,Conditional,Na,我想创建一个列d,其中包括来自其他列的所有非NA值 我尝试了ifelse,但不知道如何以正确的方式嵌套它,以便也包括c列中的值。。 也许应该使用ifelse以外的东西 这是一个虚拟数据帧: a <- c(NA, NA, NA, "A", "B", "A", NA, NA) b <- c("D", "A", "C", NA, NA, NA, NA, NA) c <- c(NA, NA, NA, NA, NA, NA, "C", NA) data <- data.fr

我想创建一个列d,其中包括来自其他列的所有非NA值

我尝试了ifelse,但不知道如何以正确的方式嵌套它,以便也包括c列中的值。。 也许应该使用ifelse以外的东西

这是一个虚拟数据帧:

 a <- c(NA, NA, NA, "A", "B", "A", NA, NA)
 b <- c("D", "A", "C", NA, NA, NA, NA, NA)
 c <- c(NA, NA, NA, NA, NA, NA, "C", NA)
 data <- data.frame(a, b, c)
我希望d列如下所示:

 data$d <- c("D", "A", "C", "A", "B", "A", "C", NA)
 View(data)

假设每行只有一个非NA值,这是一个有点丑陋的想法

data$d <- apply(data, 1, function(i) ifelse(all(is.na(i)), NA, i[!is.na(i)]))
data
#     a    b    c    d
#1 <NA>    D <NA>    D
#2 <NA>    A <NA>    A
#3 <NA>    C <NA>    C
#4    A <NA> <NA>    A
#5    B <NA> <NA>    B
#6    A <NA> <NA>    A
#7 <NA> <NA>    C    C
#8 <NA> <NA> <NA> <NA>

我也找到了这个解决方法,但我不确定我是否喜欢它:

data <- as.matrix(data)
data[is.na(data)] <- " "
data <- data.frame(data)
data$d <- with(data, paste0(a, b, c), na.rm=TRUE)
View(data)
我们可以使用pmax

数据
结果表明,这应该是在NA细胞中,而不是在NA细胞中

如果无法避免空间,请在数据帧的列上使用trimws,以在以后删除它们:

  data$d <- trimws(data$d)

我当时正在研究一个类似的问题,并且认为我可以使用dplyr和stringr提供一个更通用的解决方案

图书馆管理员 a a b c d >一维 >2 A A >3C >4 A A >5b >六甲 >7 C C > 8
由v0.2.1

数据[!is.nadata]于2019-05-06创建。这会更改值的顺序。是否需要保留包含所有NA的行?i、 e.数据框的最后一行是。d列中应包括所有带有NA的行。并且值的顺序应该是完整的。您也可以尝试data[cbind1:nrowdata,max.col!is.nadata]这实际上不是一个坏方法。你比我快了几秒钟。不过,您可以将其简化为两行:data[is.nadata]谢谢。事实证明,它将空单元格保存为一个空格,这使得d列中的因子级别与行中的因子级别一样多:-我目前无法测试它,但我认为您可以使用na.omit而不是整个匿名函数hmm。。。我原以为它会删除所有带有na的行,但现在也无法测试它。我的意思是应用na。使用apply逐行忽略。如果我没有弄错的话,如果您尝试仅从NAs中选择非NA值,而不是100%确定,那么您应该得到NA。好的……是的,这是有意义的……我将在早上测试它
data <- data.frame(a, b, c, stringsAsFactors=FALSE)
  data$d <- trimws(data$d)