2015-12-17 2 views
2

J'ai une trame de données qui ressemble à quelque chose comme »Consolidation de plusieurs colonnes en une seule colonne dans R

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

Reproductibles par:

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

Alors que si un 1 se trouve dans la colonne étant donné la deux autres colonnes auront NAs Je suis en train de consolider ces informations dans la colonne 1 de sorte qu'il ressemble à:.

print(dat) 
A 
B 
A 
C 

J'ai essayé:

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

Mais cela ne fonctionne pas. Aucune suggestion? Merci!

+0

trame de données Reproductible: dat <- data.frame (A = c (1, NA, 1, NA), B = C (NA, 1, NA, NA), C = c (NA, NA, NA, 1)) –

Répondre

4

Essayez ceci:

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

Une autre façon:

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

max.col est le gagnant pour ce genre de tâches:

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

Vainqueur gagnant au poulet. Il semble que vous, akrun, et moi sommes les seuls qui l'utilisent;) –

+1

@RichardScriven - une bonne foule pour faire partie de :-) – thelatemail

2

Une autre option est

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

Pour ajouter aux options existantes, essayez:

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