Объединить колонку с NA
У меня есть фрейм данных
data <- data.frame('a' = c('A','B','C','D','E'),
'x' = c(1,2,NA,NA,NA),
'y' = c(NA,NA,3,NA,NA),
'z' = c(NA,NA,NA,4,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 NA
Я ожидаю получить такие данные:
a N
1 A 1
2 B 2
3 C 3
4 D 4
5 E NA
Спасибо!
3 ответа
Dplyr решение с использованием coalesce
,
library(dplyr)
data %>%
mutate(N = coalesce(x, y, z)) %>%
select(a, N)
a N
1 A 1
2 B 2
3 C 3
4 D 4
5 E NA
Нет необходимости select
с transmute
:
data %>%
transmute(a, N = coalesce(x, y, z))
pmax
кажется, напрашивается здесь, что должно быть значительно быстрее на больших данных по сравнению с циклической обработкой каждой строки:
do.call(pmax, c(data[c("x","y","z")],na.rm=TRUE) )
#[1] 1 2 3 4 NA
cbind(data["a"], N=do.call(pmax, c(data[c("x","y","z")],na.rm=TRUE) ))
# a N
#1 A 1
#2 B 2
#3 C 3
#4 D 4
#5 E NA
Вы можете попробовать что-то вроде этого:
> result <- apply(data[, -1], 1, function(x) ifelse(all(is.na(x)), NA, x[!is.na(x)]))
> data.frame(a=data[,1], N=result)
a N
1 A 1
2 B 2
3 C 3
4 D 4
5 E NA