如何使用来自多个其他列的所有非 NA 值创建新列?
How to create new column with all non-NA values from multiple other columns?
我想创建一个 d 列,其中包含其他列中的所有非 NA 值。
我试过 ifelse,但不知道如何以正确的方式嵌套它,以便也包括 c 列中的值。
也许应该使用 ifelse 以外的东西?
这是一个 "dummy" 数据框:
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
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)
事实证明,在 NA 单元格中应该只出现在“”中而不是“”中。
如果 space 无法避免,请在数据框的列上使用 trimws 将其删除:
data$d <- trimws(data$d)
我在很久以后才处理类似的问题,我想我会使用 dplyr
和 stringr
提供一个更通用的解决方案。
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 创建
我想创建一个 d 列,其中包含其他列中的所有非 NA 值。
我试过 ifelse,但不知道如何以正确的方式嵌套它,以便也包括 c 列中的值。 也许应该使用 ifelse 以外的东西?
这是一个 "dummy" 数据框:
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
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)
事实证明,在 NA 单元格中应该只出现在“”中而不是“”中。
如果 space 无法避免,请在数据框的列上使用 trimws 将其删除:
data$d <- trimws(data$d)
我在很久以后才处理类似的问题,我想我会使用 dplyr
和 stringr
提供一个更通用的解决方案。
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 创建