【问题标题】:dplyr conditional mutate based on data typedplyr 基于数据类型的条件变异
【发布时间】:2021-05-25 11:33:58
【问题描述】:

我只想转换文本格式的日期,否则不转换。我需要这个,因为有时我会以日期格式获取数据;有时以文本格式。这是我的玩具数据。

library(tidyverse)
library(lubridate)

toy_df <- tibble(date = seq(as.Date("2021/1/1"), as.Date("2021/1/5"), "days")) %>% 
  mutate(date = as.character(date))   

当我尝试这个时,它不起作用。

toy_df %>% mutate(date = if_else(is.Date(date), date, ymd(date)))

我应该如何解决这个问题?

【问题讨论】:

  • 尚未尝试重复您的代码,但可能是因为您使用的是if_else 而不是ifelse?
  • 是的,看起来这就是问题所在!我一直习惯使用 if_else。

标签: r dplyr lubridate


【解决方案1】:

is.Date 返回一个值,因此请使用 if/else 而不是矢量化 ifelse/if_else -

library(tidyverse)
library(lubridate)

toy_df %>% mutate(date = if(is.Date(date)) date else ymd(date))

#   date      
#  <date>    
#1 2021-01-01
#2 2021-01-02
#3 2021-01-03
#4 2021-01-04
#5 2021-01-05

如果您的数据格式相同,则始终无需检查条件。

toy_df %>% mutate(date = ymd(date))

【讨论】:

  • 谢谢罗纳克!那行得通。就像 if_else 的非矢量化版本一样,是否有 is.date 的矢量化版本。我在问,因为我一直使用 if_else。
  • 好吧,一列只能有一个类。所以它要么是一个日期,要么是一个字符。您永远不会在列中具有混合值。如果你想使用 ifelse 这是一个非常丑陋的解决方法 - toy_df %&gt;% mutate(date = as.Date(ifelse(rep(is.Date(date), n()), date, ymd(date)), origin = '1970-01-01')) if_else 在这里仍然不起作用。
  • 知道了!谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2018-09-08
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多