【问题标题】:using multiple sep arguments in a character string在字符串中使用多个 sep 参数
【发布时间】:2018-11-27 16:22:03
【问题描述】:

我有一个如下所示的数据框(日期):

year month start end
2000    06    01  10
2000    06    11  20
2000    06    21  30

我想创建一个字符串向量(数据框中的每一行一个),以便每个日期都遵循这种格式:

年月开始-结束(第一行是 2000 06 01-10)。

我尝试过使用带有粘贴功能的 for 循环:

titles <- character()
for (i in 1:nrow(dates)){
  titles[i] <- paste(dates[i, 1], dates[i,2], dates[i,3], dates[i,4])
}

> titles
[1] "2000 06 01 10" "2000 06 11 20" "2000 06 21 30"

但我不知道如何用破折号替换最后一个空格。有没有办法强制粘贴功能执行此操作,或者我可以使用其他功能?

感谢您的帮助

【问题讨论】:

    标签: r paste


    【解决方案1】:

    按照您的解决方案,如果您只是替换

    paste(dates[i, 1], dates[i,2], dates[i,3], dates[i,4])
    

    paste(dates[i, 1], dates[i,2], paste(dates[i,3], dates[i,4], sep = "-"))
    

    应该已经可以了。这只是将“-”分隔粘贴嵌套在“”分隔粘贴中(粘贴的默认值为“”)。

    更优雅的单行代码是使用 apply:

    apply(dates, 1, function(row)paste(row[1], row[2], paste(row[3], row[4], sep = "-")))
    [1] "2000 06 01-10" "2000 06 11-20" "2000 06 21-30"
    

    【讨论】:

    • paste 是矢量化的,因此没有理由遍历每一行。
    • @avid_user 它只能在列上矢量化,而不是行上,或者?
    • 当您编写类似paste(year, month) 的内容时,整个yearmonth 列都通过paste 传递,因此paste 只被调用一次,而不是循环遍历每个元素,paste 函数正在为 每个元素 调用。所以这是 1 次调用 vs n 次调用(n = # 个元素)。因此,前者要快得多。
    • 所有你需要写的是with(df, paste(paste(year, month, start, sep = " "), end, sep = "-")),这基本上是JasonAizkalns的答案。
    【解决方案2】:

    您可能需要考虑,而不是循环:

    df$titles <- with(df, paste(year, month, start, end, sep = "-"))
    df
    #   year month start end        titles
    # 1 2000    06    01  10 2000-06-01-10
    # 2 2000    06    11  20 2000-06-11-20
    # 3 2000    06    21  30 2000-06-21-30
    

    【讨论】:

      【解决方案3】:

      我们可以从tidyr使用unite

      library(tidyverse)
      
      df %>%
        unite("new_date", year:end, sep = " ") %>%
        mutate(new_date = sub("\\s(\\d+)$", "-\\1", new_date))
      

      或者有两个unite的:

      df %>%
        unite("temp_date", year:start, sep = " ") %>%
        unite("new_date", temp_date, end, sep = "-")
      

      输出:

            new_date
      1  2000 6 1-10
      2 2000 6 11-20
      3 2000 6 21-30
      

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 2016-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多