использование нескольких аргументов sep в символьной строке - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть фрейм данных (даты), который выглядит следующим образом:

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"

но я не могу понять, как заменить последний пробел тире.Есть ли способ заставить функцию вставки выполнить это или есть другая функция, которую я могу использовать?

Спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Вместо цикла вы можете рассмотреть:

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
0 голосов
/ 27 ноября 2018

Мы можем использовать 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
0 голосов
/ 27 ноября 2018

В соответствии с вашим решением, если вы просто замените

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"
...