J'ai le bloc de données suivant.
Var_2 Var_3 1 12 1 2 13 23 3 24 33
Je souhaite renommer le V1 en fonction de la valeur de V1
. Cela signifie que je veux renommer la variable V2
en Var_2
où le numéro 2
provient du V1
.
V1 <- c(2, 2, 2) V2 <- c(12, 13, 24) V3 <- c(3, 3, 3) V4 <- c(1, 23, 33) data <- data.frame(V1, V2, V3, V4) data V1 V2 V3 V4 1 2 12 3 1 2 2 13 3 23 3 2 24 3 33
Un moyen facile de le faire? Je veux reproduire le processus pour 500 variables. Existe-t-il un moyen d'éviter les boucles?
3 Réponses :
Peut-être que je ne comprends pas votre question, mais tant que vous n'avez besoin que des noms de la première ligne de vos données, quelque chose comme ça devrait fonctionner:
names(data) <- paste("Var",data[1,][1:ncol(data)],sep="_") > names(data) [1] "Var_2" "Var_12" "Var_3" "Var_1"
Voici une possibilité tidyverse
:
data %>% rowid_to_column() %>% gather(var, val, -rowid) %>% arrange(rowid) %>% mutate(temp = ifelse(parse_number(var) %% 2 == 0, 1, NA), var2 = ifelse(temp == 1 & is.na(lag(temp, default = 0)), paste("Var", lag(val), sep = "_"), NA)) %>% na.omit() %>% select(-var, -temp) %>% spread(var2, val) %>% select(-rowid) Var_2 Var_3 1 12 1 2 13 23 3 24 33
Premièrement, il génère un ID de ligne unique. Deuxièmement, il transforme les données du format large au format long. Troisièmement, il vérifie si les noms de colonne se composent de nombres pairs. Si tel est le cas, il attribue 1, sinon NA. Ensuite, s'il s'agit d'un nombre pair et que le décalage est NA, il combine "Var" et la valeur de la colonne décalée. Enfin, il supprime les valeurs NA et les renvoie au format large.
Approche
data.table
: pour 500 variables, vous devrez concevoir des moyens de les supprimer, non comme indiqué ici. On suppose également que toutes les colonnes auront la même valeur, c'est-à-dire 3333,2222 et ainsi de suite.
data <- data.frame(V1, V2, V3, V4) library(data.table) setDT(data) data1<-data[,list(V1,V3)] #data1[,lapply(.SD,unique)] data[,`:=`(V1=NULL,V3=NULL)] names(data)<-do.call("paste",list("Var_",unique(data1))) data Var_ 2 Var_ 3 1: 12 1 2: 13 23 3: 24 33
Vous devrez peut-être ajouter plus de données pour avoir une image plus claire de ce que vous avez l'intention de faire. Mélangez la colonne 1 avec quelque chose qui n'est pas égal à 2. Sinon, pourquoi ne pas simplement utiliser
paste0
et l'index de la colonne?@NelsonGon Ce serait toujours un seul numéro. Modifié un peu la question.
Juste une question d'intérêt: pourquoi «éviter les boucles»?
Comment le
3
de la colonneV3
est-il connecté à la colonneV4
?Le nom de la variable commence par
Var_x
, où x est le chiffre de la variable précédente. Par exemple.V4
est à renommerVar_3
, le 3 vient deV3
.3
n'est qu'un exemple, il peut s'agir d'une autre valeur de la variable précédente qui est fixée dans toute la colonne. @markus J'essaie de maîtriser la gestion des données dans R. J'ai l'impression de plusieurs articles ici et d'autres endroits que je devrais éviter les boucles car c'est lent. @vaettchenUne boucle for n'est pas une «mauvaise» chose en soi. Vous devriez l'éviter quand il y a une fonction vectorisée qui fait la même chose (mais plus efficace).