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

时间:2016-07-14 13:01:10

标签: 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.frame(a, b, c)

我希望d列看起来像这样:

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

5 个答案:

答案 0 :(得分:4)

我们可以使用pmax

do.call(pmax, c(data, list(na.rm=TRUE)))
#[1] "D" "A" "C" "A" "B" "A" "C" NA 

数据

data <- data.frame(a, b, c, stringsAsFactors=FALSE)

答案 1 :(得分:2)

假设您每行只有一个非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>

答案 2 :(得分:1)

我也发现了这种解决方法,但我不确定是否喜欢它:

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)

答案 3 :(得分:0)

原来应该只是&#34;&#34;&#34;而不是&#34; &#34;在NA细胞中。

如果空间不可避免,请在数据框的列上使用trimw以后删除它们:

  data$d <- trimws(data$d)

答案 4 :(得分:0)

我后来在处理类似的问题时,以为我会使用dplyrstringr提供更通用的解决方案。

library(tidyverse)
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)

data %>% 
  mutate_all(stringr::str_replace_na, replacement = "") %>% 
  mutate(d = stringr::str_c(a,b,c)) %>%
  mutate_all(stringr::str_replace, pattern = "^$", replacement = NA_character_)
#>      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>

reprex package(v0.2.1)于2019-05-06创建