2016-12-24 76 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

我們可以做到這一點很容易地使用meltdata.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][]