Почему 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)