2011-06-30 66 views
3

我使用rep()函數多次重複字符串中的每個元素。每個字符都包含一個狀態的信息,我需要重複三次字符向量的前三個元素,第四個元素重複五次。使用rep()函數

因此,讓我們說我有以下字符向量。

al <- c("AlabamaCity", "AlabamaCityST", "AlabamaCityState", "AlabamaZipCode") 
ak <- c("AlaskaCity", "AlaskaCityST", "AlaskaCityState", "AlaskaZipCode") 
az <- c("ArizonaCity", "ArizonaCityST", "ArizonaCityState", "ArizonaZipCode") 
ar <- c("ArkansasCity", "ArkansasCityST", "ArkansasCityState", "ArkansasZipCode") 

我想最終得到以下輸出。

AlabamaCity 
AlabamaCity 
AlabamaCity 
AlabamaCityST 
AlabamaCityST 
AlabamaCityST 
AlabamaCityState 
AlabamaCityState 
AlabamaCityState 
AlabamaZipCode 
AlabamaZipCode 
AlabamaZipCode 
AlabamaZipCode 
AlabamaZipCode 
AlabamaZipCode 
... 

我能夠通過以下命令獲得所需的輸出,但是當我穿過所有五十個州時都有點不方便。另外,我可能在阿拉巴馬州的237個城市有另一個專欄,我不可避免地遇到第一欄中的名稱與第二欄中的值匹配的問題。

dat = data.frame(name=c(rep(al[1:3],each=3), rep(al[4],each=6), 
       rep(ak[1:3],each=3), rep(ak[4],each=6))) 
    dat 


    dat2 = data.frame(name=c(rep(al[1:3],each=3), rep(al[4],each=6), 
       rep(ak[1:3],each=3), rep(ak[4],each=6)), 
       city=c(rep("x",each=15), rep("y",each=15))) 
    dat2 

當然,在現實生活中,「X」和「Y」不會是單一的值。

所以我的問題涉及是否有更有效的方式來執行此任務。與這個問題密切相關的是,何時在R中拋棄程序編程以支持OOP(不是程序員,因此第二部分可能是一個非常愚蠢的問題)。更重要的是,這是一個我應該看的任務爲一個相關的解決方案。

回答

7

根據?reptimes=可以是一個向量。那麼,怎麼樣:

dat <- data.frame(name=rep(al, times=c(3,3,3,6))) 

如果你的「狀態」數據在列表中,這也會更方便。

stateData <- list(al,ak,az,ar) 
Data <- lapply(stateData, function(x) data.frame(name=rep(x, times=c(3,3,3,6)))) 
Data <- do.call(rbind, Data) 
2

我認爲你可以結合times()說法rep通過列表以及sapply()工作。因此,首先,我們需要讓我們的列表對象:

vars <- list(al, ak, az, ar) 


# Iterate through each object in vars. By default, this returns a column for each list item. 
# Convert to vector and then to data.frame...This is probably not that efficient. 
as.data.frame(as.vector(sapply(vars, function(x) rep(x, times = c(3,3,3,6))))) 

1               AlabamaCity 
2               AlabamaCity 
3               AlabamaCity 
4              AlabamaCityST 
....snip.... 
....snip.... 
57             ArkansasZipCode 
58             ArkansasZipCode 
59             ArkansasZipCode 
60             ArkansasZipCode 
2

您可以考慮使用expand.grid,然後粘貼從該結果。