如何在Dplyr mutate函数中将data.frame列值用作函数参数

时间:2019-08-21 15:40:46

标签: r dplyr mutate

我使用mutate软件包的dplyr函数来遇到问题。我想使用一列作为strptime函数的参数

示例df:

    rdf=data.frame( 
        d="20180514",
        h=sample(1:25, 10)-1,
        m=sample(1:60, 10)-1
    )
    df = data.frame(
        stringtime = paste(rdf$d, rdf$h, rdf$m, sep=""),
        timezone = sample(rep(c("GMT", "CET"), 5), 10)
    )
    df 
          stringtime  timezone
    1   201805141701       CET
    2   201805140116       GMT
    .
    .

凭直觉,我想按如下方式运行命令:

df %>% mutate(timestamp = strptime(stringtime, tz=timezone, format="%Y%m%d%h%M")

不幸的是,我收到一条错误消息:

Error in [...]: invalid 'tz' value.

有人知道我犯了什么错误,或者是否有一个简单的解决方法?

谢谢!

1 个答案:

答案 0 :(得分:1)

更新

由于存在不同的“时区”,因此可以选择group_split然后指定first“时区”

library(dplyr)
library(purrr)
df %>% 
   group_split(timezone) %>% 
   map_df(~ .x %>% 
              mutate(timestamp = as.POSIXct(stringtime,
           format = "%Y%m%d%H%M",  tz = as.character(first(timezone)))))

根据strptime

  

strptime将字符向量转换为“ POSIXlt”类:其输入x首先由as.character转换。

POSIXlt ed为mutate

时,unclass不支持

list类作为基础结构

df %>%
    mutate(timestamp = as.POSIXlt(stringtime,  format="%Y%m%d%H%M"))
  

错误:列timestamp属于不支持的POSIXlt类;请用   代替POSIXct

代替使用as.POSIXct

df %>%
   mutate(timestamp = as.POSIXct(stringtime,  format="%Y%m%d%H%M"))
#   stringtime timezone           timestamp
#1  201805141314      GMT 2018-05-14 13:14:00
#2   20180514115      GMT 2018-05-14 11:05:00
#3  201805141434      CET 2018-05-14 14:34:00
#...