3
votes

Renommer la variable en fonction de la valeur de la variable précédente

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?


6 commentaires

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 colonne V3 est-il connecté à la colonne V4 ?


Le nom de la variable commence par Var_x , où x est le chiffre de la variable précédente. Par exemple. V4 est à renommer Var_3 , le 3 vient de V3 . 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. @vaettchen


Une 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).


3 Réponses :


1
votes

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" 


0 commentaires

1
votes

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.


0 commentaires

1
votes

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


0 commentaires