2015-03-18 4 views
1

Je voudrais vérifier TRUE, FALSE, TRUE et sept autres combinaisons dans mon cadre de données qui ont 87027 lignes et trois colonnes.Je veux écrire des résultats pour chaque ramer comme ça;Vérification de plusieurs conditions et création d'une nouvelle colonne en fonction du résultat de la vérification dans R

TRUE TRUE TRUE -> abc 
TRUE TRUE FALSE-> ab 
TRUE FALSE TRUE->ac 
FALSE TRUE TRUE->bc 

et d'autres ...

Voici un exemple simplifié dataframe:

A  B  C 
TRUE FALSE FALSE 
TRUE FALSE FALSE 
FALSE FALSE FALSE 
TRUE FALSE TRUE 
FALSE FALSE TRUE 

à cet effet j'ai écrit une boucle

for (i in 1:87027) { 
    if (data$A[i]=="TRUE" & data$B[i]=="TRUE") { 
     if (data$C[i]=="TRUE") { 
      data$new[i]="abc" 
     } 
    } 
    if (data$A[i]=="TRUE" & data$B[i]=="TRUE") { 
     if (data$C[i]=="FALSE") { 
      data$new[i]="ab" 
     } 
    } 
    if (data$A[i]=="TRUE" & data$B[i]=="FALSE") { 
     if (data$C[i]=="TRUE") { 
      data$new[i]="ac" 
     } 
    } 
    if (data$A[i]=="TRUE" & data$B[i]=="FALSE") { 
     if (data$C[i]=="FALSE") { 
      data$new[i]="a" 
     } 
    } 
    if (data$A[i]=="FALSE" & data$B[i]=="FALSE") { 
     if (data$C[i]=="FALSE") { 
      data$new[i]="Nothing" 
     } 
    } 
    if (data$A[i]=="FALSE" & data$B[i]=="TRUE") { 
     if (data$C[i]=="TRUE") { 
      data$new[i]="bc" 
     } 
    } 
    if (data$A[i]=="FALSE" & data$B[i]=="TRUE") { 
     if (data$C[i]=="FALSE") { 
      data$new[i]="b" 
     } 
    } 
    if (data$A[i]=="FALSE" & data$B[i]=="FALSE") { 
     if (data$C[i]=="TRUE") { 
      data$new[i]="c" 
     } 
    } 
} 

l'exécution de cette prise de code quelques minutes, je me demande comment je peux le faire d'une manière sophistiquée

+0

Ce code me fait mal au coeur – Dason

+0

merci Dason, j'ai essayé de résoudre mon problème d'une manière plus ancienne parce que je suis un nouvel utilisateur en R –

Répondre

2
# Make some sample data (you should do this next time...) 
n <- 87027 
col <- 3 
mat <- matrix(sample(c(T,F), n*col, rep=T), n, col) 

# Function that does the conversion you want 
# It takes in x which is assumed to be a vector of three logical 
# values 
f <- function(x){ 
    if(all(!x)){ 
    return("Nothing") 
    } 
    out <- paste(letters[1:3][x], collapse = "") 
    return(out) 
} 

# Use f on every row of mat 
output <- apply(mat, 1, f) 

qui donne

> head(mat) 
     [,1] [,2] [,3] 
[1,] TRUE FALSE FALSE 
[2,] FALSE TRUE FALSE 
[3,] FALSE FALSE FALSE 
[4,] TRUE FALSE TRUE 
[5,] FALSE TRUE FALSE 
[6,] TRUE FALSE FALSE 
> head(output) 
[1] "a"  "b"  "Nothing" "ac"  "b"  "a" 

et a pris très peu de temps à courir.