在字符串中使用多个 sep 参数

Posted

技术标签:

【中文标题】在字符串中使用多个 sep 参数【英文标题】:using multiple sep arguments in a character string 【发布时间】: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"

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

感谢您的帮助

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在字符串中使用多个 sep 参数的主要内容,如果未能解决你的问题,请参考以下文章

R之字符串连接函数paste

20180729--第3章字符串

Python标准库 内置函数print objects sep ' ' end ' ' file sys st

python如何打印输出

paste0() 函数中的 sep 参数的行为与预期不符[关闭]

R语言 字符串拼接