R dplyr::mutate_和lubridate::parse_date_时间标准评估未按预期协同工作

R dplyr::mutate_和lubridate::parse_date_时间标准评估未按预期协同工作,r,dplyr,lubridate,R,Dplyr,Lubridate,我认为这是dplyr中的一个bug,但这可能只是我自己对标准评估的误解。如果有人能帮忙,那就太好了 考虑: 我尝试了许多变体,即使是interp,只是为了确保它不是我对NSE的理解,比如: 也许我只是错过了一些明显的东西,让它与变异! 你刚才试过了吗 df2 <- df %>% mutate_(response_date = ~parse_date_time(start_date, orders ="mdY hm")) df2% 变异(响应日期=~parse日期时间(开

我认为这是dplyr中的一个bug,但这可能只是我自己对标准评估的误解。如果有人能帮忙,那就太好了

考虑:

我尝试了许多变体,即使是interp,只是为了确保它不是我对NSE的理解,比如:

也许我只是错过了一些明显的东西,让它与变异!

你刚才试过了吗

df2 <- df %>%
    mutate_(response_date = ~parse_date_time(start_date, orders ="mdY hm"))
df2%
变异(响应日期=~parse日期时间(开始日期,orders=“mdY hm”))
使用公式表示法只是为了避免R试图计算给定表达式。因此,您可以使用与NSE中完全相同的调用,但要加上一个波形


要演示如何以编程方式执行此操作,请执行以下操作:

x <- "start_date"
df2 <- df %>%
    mutate_(response_date = formula(sprintf("~parse_date_time(%s, orders='mdY hm')", x)))

x标准求值方法对事物的求值(多多少少)与在base R中一样,这意味着如果要将
var_name
求值为列名,则不能使用不带引号的列名;相反,您必须指定要子集的data.frame

不过,这里还有另一个问题:
tbl_-df
在子集到列名时不返回向量,而是返回单个列
tbl_-df
,而
parse_-date\u-time
无法处理

比如说,

> df[,var_name]
Source: local data frame [2 x 1]

        start_date
             (chr)
1 07/15/2015 15:39
2 07/15/2015 15:42

> dfdf <- as.data.frame(df)
> dfdf[,var_name]
[1] "07/15/2015 15:39" "07/15/2015 15:42"
将会失败,但是

dfdf <- as.data.frame(df)
dfdf %>% mutate_(response_date = ~parse_date_time(dfdf[,var_name], orders ="mdY hm"))
dfdf%mutate(响应日期=~parse日期时间(dfdf[,var\u name],orders=“mdY hm”))
会有用的。您可以通过使用
[[
子集来实现上述功能,该子集为
tbl_df
数据返回一个向量。frame
;另一个选项是使用
unlist
强制解决问题


据我所知,没有办法调用在链过程中创建的列或分组列(除了嵌套分组);总体而言,SE选项提供了一些编程可能性,但以方便为代价(加上大量的混乱).

这不起作用,因为我试图以编程方式使用它,目标是使用一个包含字符串(“开始日期”)的变量(varname)这是数据帧df中的一列。无论如何,使用NSE版本不是更容易吗?或者你是想在上面的代码块中使用var_name而不是start_date吗?@Manny不,我是想使用start_date。这样做可以让你使用标准方法构造公式。@alistare很抱歉,我没有看到你更新你的答案ooi。我认为总体而言,最干净、最快的解决方案可能是在管道之外进行。感谢您提供的解决方案和建议。我认为Hong ooi在技术上正是我所寻求的。感谢这有助于我理解潜在问题。如果这是真的,我有几个后续问题:…而不是单个问题e列tbl_df,解析日期时间无法处理。为什么NSE版本仍然正确返回,它不是tbl_df吗?还有,哪种解决方法是最有效的解决方法?当您向NSE版本传递一个不带引号的列名时,它在内部子集到该列中的值向量。
dplyr
在返回方面是一致的
tbl_df
tbl_dt
数据帧并获取类似于数据帧的对象,但在内部,它使用向量来处理单个变量,因为这是其他所有东西都使用的。至于什么是最有效的,除非您正在运行此代码的数千次迭代,或者您的数据非常庞大,否则速度可能不是问题,所以请选择当你在6个月左右的时间里观察它时,无论哪一个都是有意义的。如果速度真的很重要,保持
tbl_df
可能是最快的,因为你避免转换,但你必须进行基准测试才能看到。如果你将它插入一个长度合适的管道,这可能会爆炸,因为它将使用
dfdf
而不是通过管道处理的。@HongOoi是的。你知道有没有一种方法可以引用SE中创建的变量(除了将代码编写为字符串之外)?事实上,这是一个长期存在的问题。
df_SE_working <- df %>% 
          mutate_(response_date = ~parse_date_time(df[[var_name]], orders ="mdY hm"))
df_SE_interp_working <- df %>% 
          mutate_(response_date = interp(~parse_date_time(df[[var_name]], orders ="mdY hm"), var_name = var_name))
df2 <- df %>%
    mutate_(response_date = ~parse_date_time(start_date, orders ="mdY hm"))
x <- "start_date"
df2 <- df %>%
    mutate_(response_date = formula(sprintf("~parse_date_time(%s, orders='mdY hm')", x)))
> df[,var_name]
Source: local data frame [2 x 1]

        start_date
             (chr)
1 07/15/2015 15:39
2 07/15/2015 15:42

> dfdf <- as.data.frame(df)
> dfdf[,var_name]
[1] "07/15/2015 15:39" "07/15/2015 15:42"
df %>% mutate_(response_date = ~parse_date_time(df[,var_name], orders ="mdY hm"))
dfdf <- as.data.frame(df)
dfdf %>% mutate_(response_date = ~parse_date_time(dfdf[,var_name], orders ="mdY hm"))