2011-06-30 31 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,然后粘贴从该结果。