2016-12-24 3 views
1

У меня есть строка кода, которая должна выполняться 12 раз с заменой строки каждый раз.Увеличение на 1 в замене строки

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

приращения числа в конце каждого имени столбца, по одному, это будет производить 12 отдельных dataframes, которые я затем связать вместе с rbind

Моей целью, чтобы написать функцию, которая принимает последнюю характер окнеИМЯстолбец и имя объекта и приращения от 1 как x <- x + 1 и останавливается на 12. Я безнадежно пытаюсь написать функцию, которая выглядит как

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) 
} 

, но я до сих пор не знаком с синтаксисом R. Любые советы будут оценены

выписаны полностью, то функция будет выполнять следующие действия:

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) 

ответ

2

переделана, чтобы соответствовать запросу.

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])) 
} 

Этот код не проверен, так как у нас нет мастера, но вывод должен быть тем, что вы хотите.

+0

Спасибо, я отредактировал мой вопрос, чтобы быть немного более точным. Я выписал полный код вручную - мне просто интересно, как я могу автоматизировать это в будущем. Как бы вы включили элемент 'rbind' в свое решение? –

+0

Что делает 'master'? – G5W

+0

'master' - это имя фрейма данных, содержащего все 48 из этих столбцов. –

1

Вы должны использовать некоторые регулярное выражение с sub. Похоже, вы хотите заменить цифру в конце строки с увеличением числа, вы можете проверить это, где в шаблоне $ совпадает с концом строки и, таким образом, \\d+$ соответствует цифре в конце строки:

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" 

по вашему обновлению, вы, вероятно, хотите что-то вроде этого: вместо

# 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

Мы можем сделать это легко с помощью melt из data.table, который может принимать несколько 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][]