为什么mutate只应用于第一行并将结果重复到其余部分

时间:2015-05-24 11:42:24

标签: r shiny

我有一个由多列组成的数据框。其中一个是统一格式的date_created列。我想将其拆分为yearmonthday并将这些列添加到同一数据框中。

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 个答案:

答案 0 :(得分:3)

您可以使用separate

中的extracttidyr
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)