【问题标题】:pasting x number of strings to y number of strings using sapply使用 sapply 将 x 个字符串粘贴到 y 个字符串
【发布时间】:2013-04-27 02:30:07
【问题描述】:

我有两个向量,向量“t”是时间,向量“d”是日期。
我想为 d 中的所有日期提取 t 中所有时间的数据
我知道如何将日期从字符格式化为 POSIXct,所以这不是问题,我尝试使用 sapply 逐日查看我使用的代码如下:

    t <- c("11:25:30", "12:00:00", "15:31:25", "19:15:48", "23:51:06")
    d <- c("2013-01-17", "2013-01-24", "2013-02-09", "2013-02-11")  
    c1 <- sapply(d, function(i) paste(d[i],t))

如果使用 lapply,我希望看到一个列表,或者在将 sapply 与字符串一起使用时看到一个向量“ "2013-01-17 11:25:30", "2013-01-17 12:00:00", 2013-01-17 15:31:25" ... 一直到最后将每个日期与t 中的所有时间。

【问题讨论】:

    标签: r


    【解决方案1】:

    这是最快的方法,而且打字量最少:

    c(outer(d, t, paste))
    
    ##  [1] "2013-01-17 11:25:30" "2013-01-24 11:25:30" "2013-02-09 11:25:30"
    ##  [4] "2013-02-11 11:25:30" "2013-01-17 12:00:00" "2013-01-24 12:00:00"
    ##  [7] "2013-02-09 12:00:00" "2013-02-11 12:00:00" "2013-01-17 15:31:25"
    ## [10] "2013-01-24 15:31:25" "2013-02-09 15:31:25" "2013-02-11 15:31:25"
    ## [13] "2013-01-17 19:15:48" "2013-01-24 19:15:48" "2013-02-09 19:15:48"
    ## [16] "2013-02-11 19:15:48" "2013-01-17 23:51:06" "2013-01-24 23:51:06"
    ## [19] "2013-02-09 23:51:06" "2013-02-11 23:51:06"
    

    【讨论】:

    • +1,又好又短。很高兴看到在 R 中总有另一种方法可以完成某事。
    【解决方案2】:

    您可以像这样使用expand.gridpaste

    t <- c("11:25:30", "12:00:00", "15:31:25", "19:15:48", "23:51:06")
    d <- c("2013-01-17", "2013-01-24", "2013-02-09", "2013-02-11") 
    do.call("paste", expand.grid(d,t))
     [1] "2013-01-17 11:25:30" "2013-01-24 11:25:30" "2013-02-09 11:25:30"
     [4] "2013-02-11 11:25:30" "2013-01-17 12:00:00" "2013-01-24 12:00:00"
     [7] "2013-02-09 12:00:00" "2013-02-11 12:00:00" "2013-01-17 15:31:25"
    [10] "2013-01-24 15:31:25" "2013-02-09 15:31:25" "2013-02-11 15:31:25"
    [13] "2013-01-17 19:15:48" "2013-01-24 19:15:48" "2013-02-09 19:15:48"
    [16] "2013-02-11 19:15:48" "2013-01-17 23:51:06" "2013-01-24 23:51:06"
    [19] "2013-02-09 23:51:06" "2013-02-11 23:51:06"
    

    我还没有找到使用这种语法调整pastesep 参数的方法,但它提供了您需要的输出。

    【讨论】:

      【解决方案3】:

      您可以将expand.grid()apply() 结合使用。 expand.grid() 将生成dt 的所有可能组合的数据框。 with apply() 函数 paste() 应用于此数据帧的每一行。 collapse=" " 确保字符串放在一起并在它们之间放置空格。

      apply(expand.grid(d,t),1,paste,collapse=" ")
      
       [1] "2013-01-17 11:25:30" "2013-01-24 11:25:30" "2013-02-09 11:25:30"
       [4] "2013-02-11 11:25:30" "2013-01-17 12:00:00" "2013-01-24 12:00:00"
       [7] "2013-02-09 12:00:00" "2013-02-11 12:00:00" "2013-01-17 15:31:25"
      [10] "2013-01-24 15:31:25" "2013-02-09 15:31:25" "2013-02-11 15:31:25"
      [13] "2013-01-17 19:15:48" "2013-01-24 19:15:48" "2013-02-09 19:15:48"
      [16] "2013-02-11 19:15:48" "2013-01-17 23:51:06" "2013-01-24 23:51:06"
      [19] "2013-02-09 23:51:06" "2013-02-11 23:51:06"
      

      【讨论】:

      • @PaulHiemstra (+1) 不经常使用 do.call() ,所以忘了这个
      • 寻找最短的单线来解决问题总是一项运动。您的解决方案完全有效,做得很好。最重要的问题可能是使用expand.grid
      • 两者都有效。我之前没有使用过 expand.grid 或 do.call。但这很棒,我学到了很多东西。我会查查他们俩。但只是为了快速理解代码逻辑,我假设 expand.grid(d,t) 将 d,t 放在一个虚拟 data.frame 中,忽略它们的长度差异,然后我们将粘贴函数应用于每个此虚拟数据框的行。这是这段代码的一般逻辑吗?
      • 是的,完全正确。 expand.grid() 将 d 和 t 的所有可能组合生成数据框,然后将 paste() 应用于该数据框的每一行。
      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2022-01-01
      • 2013-05-21
      • 2022-10-20
      • 1970-01-01
      相关资源
      最近更新 更多