我正在使用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
...
我能够使用以下命令获得所需的输出,但是当我运行所有50个州时,它有点不方便。另外,我可能在阿拉巴马州有另外一个包含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变得很重要(不是程序员,所以第二部分可能是一个非常愚蠢的问题)更重要的是,这是一个我应该看的任务对于与oop相关的解决方案。
答案 0 :(得分:7)
根据?rep
,times=
可以是矢量。那么,这个怎么样:
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)
答案 1 :(得分:2)
我认为您可以将times()
的{{1}}参数合并到rep
的列表中。首先,我们需要创建列表对象:
sapply()
答案 2 :(得分:2)
您可以考虑使用expand.grid
,然后粘贴结果。