我有一个由多列组成的数据框。其中一个是统一格式的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
我猜这个函数没有为每一行调用,但是无法理解为什么。请解释一下它是如何工作的,并提供示例代码以达到预期的效果。感谢
答案 0 :(得分:3)
您可以使用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
data.table
library(data.table)#v1.9.5
setDT(d1)[, c('month', 'day', 'year') := tstrsplit(date_created, '-')]
关于代码中的问题,只需从整个&quot; date_created&#39;中选择第1,第2和第3个元素。柱。只需使用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])
或者另一种选择是转换为日期类,然后提取“白天”,“月份”和“#39;月份”。和&#39;年&#39;
library(lubridate)
d1 %>%
mutate(date=mdy(date_created), year=year(date),
month=month(date), day=day(date)) %>%
select(-date)