2016-11-30 1 views
0

J'apprends à mettre à jour les données de colonne en utilisant this previous post. Cependant, existe-t-il une astuce pour spécifier quelle colonne doit fournir la valeur mise à jour finale en cas de conflit. Par exemple, je peux combiner des colonnes de données aussi longtemps que seule valeur existe par ligne:dans R, colonne de combinaison pour supprimer NA tout en priorisant les remplacements spécifiques

data <- data.frame('a' = c('A','B','C','D','E'), 
    'x' = c(NA,NA,3,NA,NA), 
    'y' = c(1,2,NA,NA,NA), 
    'z' = c(NA,NA,NA,4,5)) 
cbind.data.frame(data3[1], mycol=c(na.omit(c(t(data3[, -1]))))) 

Comment pourrais-je forcer la valeur à venir de newVal dans le cas suivant?

data <- data.frame('a' = c('A','B','C','D','E','F'), 
        'x' = c(NA,NA,NA,3,NA,NA), 
        'y' = c(1,2,8,NA,NA,NA), 
        'z' = c(99,NA,4,NA,4,5)) 

Répondre

2

Utilisez max.col et une indexation de la matrice (spécifiant quelle combinaison ligne/col à prendre):

cbind(1:nrow(data), max.col(!is.na(data[-1]), "last")) 
#  [,1] [,2] 
#[1,] 1 3 
#[2,] 2 2 
#[3,] 3 3 
#[4,] 4 1 
#[5,] 5 3 
#[6,] 6 3 

data[-1][cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))] 
#[1] 99 2 4 3 4 5 

cbind(data[1], result=data[-1][cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))]) 
# a result 
#1 A  99 
#2 B  2 
#3 C  4 
#4 D  3 
#5 E  4 
#6 F  5 

Si vous avez besoin d'une colonne particulière pour être la priorité donnée toujours, faire un objet temporaire avec les colonnes dans un ordre particulier, puis le traiter:

tmp <- data[-1][c("z", setdiff(names(data[-1]), "z"))] 
tmp[cbind(1:nrow(tmp), max.col(!is.na(tmp), "first"))] 
#[1] 99 2 4 3 4 5 
+0

J'ai mis à jour mon exemple pour éviter le cas trivial où nous recherchons simplement la valeur maximale dans la dernière colonne; ça pourrait être plus ou moins que. – val

+1

@val - le code ne sélectionne pas la valeur maximale, il sélectionne la dernière valeur non -NA qui traverse les colonnes. Ce n'est peut-être pas le maximum numérique. Avez-vous même essayé le code? – thelatemail

+0

je vois. THX. au lieu de la colonne max est-il un moyen de spécifier la colonne dont la valeur devrait provenir? – val