在字符串中使用多个 sep 参数
using multiple sep arguments in a character string
我有一个如下所示的数据框(日期):
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"
但我不知道如何用破折号替换最后一个 space。有没有办法强制粘贴函数执行此操作,或者我可以使用其他函数吗?
感谢帮助
按照你的解决方法,如果你只是更换
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"
除了循环,您可能需要考虑:
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
我们可以使用 unite
从 tidyr
:
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
我有一个如下所示的数据框(日期):
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"
但我不知道如何用破折号替换最后一个 space。有没有办法强制粘贴函数执行此操作,或者我可以使用其他函数吗?
感谢帮助
按照你的解决方法,如果你只是更换
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"
除了循环,您可能需要考虑:
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
我们可以使用 unite
从 tidyr
:
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