2016-08-30 46 views
1

我有一個數據幀結合柱與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 

謝謝!

+0

這不是完全重複的,注意第5行,當所有行元素都是NA時,它仍然是NA。如果你按照你所鏈接的答案,那麼OP將失去該元素(第5行)。 –

+0

好的,不是確切的。但足夠接近。 –

+1

我可能會做類似'cbind(data [1],N = data [-1] [cbind(1:nrow(data),max.col(!is.na(data [-1])))] )' –

回答

1

你可能想嘗試這樣的:

> 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 
4

一個dplyr解決方案使用​​3210。

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 

無需selecttransmute

data %>% 
    transmute(a, N = coalesce(x, y, z)) 
+1

或者'data%>%transmute(a,N = coalesce(x,y,z))' – alistaire

+0

@alistaire我總是忘記'transmute',好想法。 – aosmith

+0

你也可以使用sql來輕鬆完成這個任務 - 'library(sqldf); sqldf(「select a,coalesce(x,y,z)as N from data」)'例如。 – thelatemail

1

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