【问题标题】:Repeat each element in a string a certain number of times将字符串中的每个元素重复一定次数
【发布时间】:2011-09-26 04:47:26
【问题描述】:

我正在使用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 相关的解决方案。

【问题讨论】:

    标签: string r


    【解决方案1】:

    根据?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】:

      我认为您可以将reptimes() 参数与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
      

      【讨论】:

        【解决方案3】:

        您可以考虑使用expand.grid,然后粘贴结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-06
          • 2020-04-04
          • 1970-01-01
          • 2017-08-02
          • 1970-01-01
          相关资源
          最近更新 更多