如何预处理 R 数据框中的字符列

How to preprocess a character column in an R data frame

给定这个数据框

row | time | name
-----------------
1   | 2 min| bob
2   | 7 min| john
3   | 1 hr 5 min| jess

我想将时间列处理为包含分钟数的数字列。我有一个函数可以将字符串处理成一个数字,但是当我尝试将它 apply 转换为 mutate/transform 原始数据框 data.frame(apply(dataframe, 2, parse_str)) 时,它崩溃了或者根本不起作用。一旦我可以应用转换函数,我计划通过 df = as.numeric(as.character(dataframe$time)) 将字符列转换为数字,但还没有测试它。

关于如何让我的预处理函数正确地mutate/transform/创建一个新数据帧有什么想法吗?

正如评论所说,最好不要 apply:

> df <- data.frame(time=c('2 min', '7 min', '1 hr 5 min'), name = c('bob', 'john', 'jess'))
> df
        time name
1      2 min  bob
2      7 min john
3 1 hr 5 min jess
> df$time <- as.numeric(parse_str(df$time))
> df
        time name
1          2  bob
2          7 john
3         65 jess

如果您的 parse_str 函数 returns 数字如您所说,那么您甚至不需要 as.numeric 调用。

这是另一个使用 and , for anyone who might want to reproduce your results, but do not have your function. Using

的选项
# install.packages(c("tidyverse", "lubridate"), dependencies = TRUE)
library(tidyverse)
library(lubridate)

df %>% mutate(
            `t formated` = str_replace(time, "(^[0-9] min)", "0 hr \1"),
            `t hours minues` = hm(`t formated`),
            `t duration` = as.duration(`t hours minues`),
            `t numeric` = as.numeric(`t duration`, "minutes")
            ) %>% as_tibble()
#> # A tibble: 3 x 6
#>         time   name `t formated` `t hours minues`        `t duration` `t numeric`
#>       <fctr> <fctr>        <chr>     <S4: Period>      <S4: Duration>       <dbl>
#> 1      2 min    bob   0 hr 2 min            2M 0S   120s (~2 minutes)           2
#> 2      7 min   john   0 hr 7 min            7M 0S   420s (~7 minutes)           7
#> 3 1 hr 5 min   jess   1 hr 5 min         1H 5M 0S 3900s (~1.08 hours)          65