Почему mutate применяется только к первой строке и повторяет свой результат для остальных

У меня есть фрейм данных, который состоит из нескольких столбцов. Один из них является date_created колонка в едином формате. Я хочу разделить это на year, month, day и добавьте эти столбцы в один и тот же фрейм данных.

input:
id      date_created
1       02-20-2014
2       01-15-2015

result:
id      date_created     year    month    day
1       02-20-2014       2014    2        20
2       01-15-2015       2015    1        15

У меня есть пример кода, который работает неправильно

displays <- displays %>%
        mutate(month = as.integer(unlist(strsplit(date, '-')))[1], 
               day   = as.integer(unlist(strsplit(date, '-')))[2],
               year  = as.integer(unlist(strsplit(date, '-')))[3]
              )

он производит следующее:

id      date_created     year    month    day
1       02-20-2014       2014    2        20
2       01-15-2015       2014    2        20

Я думаю, что функция не вызывается для каждой строки, но не могу понять, почему. Объясните, пожалуйста, как это работает и предоставьте пример кода для достижения желаемого результата. Спасибо

1 ответ

Решение

Ты можешь использовать separate или же extract от tidyr

library(tidyr)
separate(d1, date_created, c('month', 'day', 'year'), remove=FALSE)

Или же

extract(d1, date_created, c('month', 'day', 'year'),
              '([^-]+)-([^-]+)-([^-]+)', remove=FALSE)

Или же cSplit от splitstackshape

library(splitstackshape)
cSplit(d1, 'date_created', sep="-", drop=FALSE)

Или используя tstrsplit из версии devel data.table

library(data.table)#v1.9.5
setDT(d1)[, c('month', 'day', 'year') := tstrsplit(date_created, '-')]

Что касается проблемы в вашем коде, он просто выбирает 1-й, 2-й и 3-й элемент из всего столбца date_created. Просто используйте rowwise

  library(dplyr)
  d1 %>% 
     rowwise() %>%
     mutate(month= as.integer(unlist(strsplit(date_created, '-')))[1], 
            day= as.integer(unlist(strsplit(date_created, '-')))[2],
            year=as.integer(unlist(strsplit(date_created, '-')))[3])

Или другой вариант - преобразовать в класс даты, а затем извлечь "день", "месяц" и "год"

  library(lubridate)
  d1 %>% 
     mutate(date=mdy(date_created), year=year(date),
            month=month(date), day=day(date)) %>% 
     select(-date)
Другие вопросы по тегам