2016-12-24 2 views
1

J'ai une ligne de code qui doit être exécutée 12 fois avec un remplacement de chaîne à chaque fois.Incrément de 1 dans le remplacement de chaîne

unique1 <- unique(master[c("Country_University_1", "City_University_1", "Latitude_city_1", "Longitude_city_1")]) 

En incrémenter les chiffres à la fin de chaque nom de colonne par un, cela produirait 12 dataframes séparés que je puis lier avec rbind

Mon objectif est d'écrire une fonction qui prend la dernière caractère du nom colonne et le nom d'objet et par incréments de 1 comme x <- x + 1 et arrête à 12. Je suis désespérément en train d'écrire une fonction qui ressemble à quelque chose comme

x <- c("Country_University_1", "City_University_1", "Latitude_city_1", "Longitude_city_1") 
for (i in 1:12){ 
    gsub("i", nchar(x[1:4]-1) x[1:4]) 
    print(x) 
} 

mais je ne suis toujours pas familier avec la syntaxe R. Tout conseil serait apprécié

écrit à pleinement, la fonction serait effectuer les opérations suivantes:

unique1 <- unique(master[c("Country_University_1", "City_University_1", "Latitude_city_1", "Longitude_city_1")]) 
unique2 <- unique(master[c("Country_University_2", "City_University_2", "Latitude_city_2", "Longitude_city_2")]) 
unique3 <- unique(master[c("Country_University_3", "City_University_3", "Latitude_city_3", "Longitude_city_3")]) 
unique4 <- unique(master[c("Country_University_4", "City_University_4", "Latitude_city_4", "Longitude_city_4")]) 
unique5 <- unique(master[c("Country_University_5", "City_University_5", "Latitude_city_5", "Longitude_city_5")]) 
unique6 <- unique(master[c("Country_University_6", "City_University_6", "Latitude_city_6", "Longitude_city_6")]) 
unique7 <- unique(master[c("Country_University_7", "City_University_7", "Latitude_city_7", "Longitude_city_7")]) 
unique8 <- unique(master[c("Country_University_8", "City_University_8", "Latitude_city_8", "Longitude_city_8")]) 
unique9 <- unique(master[c("Country_University_9", "City_University_9", "Latitude_city_9", "Longitude_city_9")]) 
unique10 <- unique(master[c("Country_University_10", "City_University_10", "Latitude_city_10", "Longitude_city_10")]) 
unique11 <- unique(master[c("Country_University_11", "City_University_11", "Latitude_city_11", "Longitude_city_11")]) 
unique12 <- unique(master[c("Country_University_12", "City_University_12", "Latitude_city_12", "Longitude_city_12")]) 

output <- rbind(unique1, unique2, unique3, unique4, unique5, unique6, unique7, unique8, unique9, unique10, unique11, unique12) 

Répondre

2

Redone pour correspondre à la demande.

Base = c("Country_University_", "City_University_", "Latitude_city_", "Longitude_city_") 
output = rep(NULL,4) 
for(i in 1:12) { 
    ColNames = sapply(Base, function(s) { paste(s, i, sep="") }) 
    output=rbind(output, unique(master[ColNames])) 
} 

Ce code n'a pas été testé parce que nous n'avons pas de maître, mais la sortie devrait être ce que vous voulez.

+0

Merci, j'edited ma question d'être un peu plus précis. J'ai écrit le code complet manuellement - je me demande simplement comment je peux automatiser cela dans le futur. Comment incluriez-vous l'élément 'rbind' dans votre solution? –

+0

Que fait 'master'? – G5W

+0

'master' est le nom de la base de données contenant toutes les 48 de ces colonnes –

1

Vous devez utiliser une expression rationnelle sub. On dirait que vous voulez remplacer le chiffre à la fin de la chaîne avec un nombre croissant, vous pouvez vérifier sur ce point, où dans le modèle $ correspond à la fin de la chaîne et donc \\d+$ correspond à chiffres à la fin de la chaîne:

for (i in 1:2) { print(sub("\\d+$", i, x)) } 

#[1] "Country_University_1" "City_University_1" "Latitude_city_1"  
#[4] "Longitude_city_1"  
#[1] "Country_University_2" "City_University_2" "Latitude_city_2"  
#[4] "Longitude_city_2" 

Selon votre mise à jour, vous voulez probablement quelque chose comme ceci:

# get the number at the end of column names 
number = sub(".*_(\\d+)$", "\\1", names(master)) 

# split the data frame by the number, rename each sub data frame and bind them together 
do.call(rbind, lapply(split.default(master, number), 
         function(sdf) setNames(sdf, sub("_\\d+$", "", names(sdf))))) 
0

Nous pouvons le faire facilement en utilisant melt de data.table qui peut prendre plusieurs measurepatterns

library(data.table) 
melt(setDT(master), measure = patterns("^Country", "^City", "^Latitude", "^Longitude"), 
    value.name = c("Country_University", "City_University", "Latitude_city", "Longitude_city") 
     ][, variable := NULL][]