2015-12-17 111 views
2

我有一個數據幀,看起來像」合併多個列合併到一列中的R

print(dat) 
A B C 
1 NA NA 
NA 1 NA 
1 NA NA 
NA NA 1 

重複性的:

dat <- data.frame(A=c(1,NA,1,NA), B=c(NA,1,NA,NA), C=c(NA,NA,NA,1)) 

因此,如果1在給定列中發現的其他兩列將有NAs。我試圖將這些信息整合到1列中,因此它看起來像:

print(dat) 
A 
B 
A 
C 

我曾嘗試過:

dat<-ifelse(dat$A==1,"A",ifelse(dat$B==1,"B",ifelse(dat$C==1,"C","NA"))) 

但它不起作用。有什麼建議麼?謝謝!

+0

重現的數據幀:DAT < - data.frame(A = C(1,NA,1,NA),B = C(NA,1, NA,NA),C = c(NA,NA,NA,1)) –

回答

4

試試這個:

rep(names(dat),nrow(dat))[c(t(dat)) == 1 & !is.na(c(t(dat)))] 
[1] "A" "B" "A" "C" 
2

另一種方式:

> t(dat) %>% melt() %>% na.omit() %>% select(X1) 
    X1 
1 A 
5 B 
7 A 
12 C 
3

max.col是這幾類任務的贏家:

colnames(dat)[max.col(!is.na(dat))] 
#[1] "A" "B" "A" "C" 
+0

獲勝者優勝者雞晚餐。看起來像你,akrun和我是唯一曾經使用過它的人) –

+1

@RichardScriven - 成爲一部分的好朋友:-) – thelatemail

2

另一種選擇是

names(dat)[+(!is.na(dat)) %*% seq_along(dat)] 
#[1] "A" "B" "A" "C" 
1

要添加到現有的選項,嘗試:

na.omit(stack(dat))$ind 
## [1] A A B C 
## Levels: A B C