R:在dplyr :: mutate()中求值时,具有不同输出的相同函数

时间:2018-10-29 01:29:04

标签: r dplyr tidyverse

我是R和tidyverse的新手。现在我遇到了一个问题:

假设我们有字符“ 02-01-01”:

运行该函数时,我们得到:

as.Date("2-Jan-01", tryFormats = c("%y-%b-%d", "%b-%y-%d"))

[1] "2002-01-01"

但是,当我使用mutate命令时:

df %>%
mutate(birth_date=as.Date(as.character(birth),
tryFormats = c("%y-%b-%d", "%b-%y-%d")))

转换条目2-Jan-01时,我得到NA而不是2002-01-01

我不明白为什么相同的函数会在mutate内部和外部计算出不同的值。有人可以解释吗?预先谢谢你!

1 个答案:

答案 0 :(得分:1)

您的代码对我来说运行正常。

librayr(dplyr)

df <- tibble(
  birth = "2-Jan-01"
)

不更改您的代码:

df %>%
  mutate(birth_date = as.Date(
    as.character(birth),
    tryFormats = c("%y-%b-%d", "%b-%y-%d")
  ))

我得到:

  birth    birth_date
  <chr>    <date>    
1 2-Jan-01 2002-01-01

(请注意,我使用了小技巧,但它与传统数据框的作用相同)。

现在,您无需在代码中使用as.character(),因为“出生”已经属于类字符了。因此,将其删除:

df %>%
  mutate(
    birth_date = as.Date(
      birth,
      tryFormats = c("%y-%b-%d", "%b-%y-%d")
    ))

给出相同的结果。

如果您不想保留旧的“出生”列,则可以改用transmute()

df %>%
  transmute(
    birth_date = as.Date(
      birth,
      tryFormats = c("%y-%b-%d", "%b-%y-%d")
    ))

哪个给:

  birth_date
  <date>    
1 2002-01-01