如何预处理 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
调用。
这是另一个使用 lubridate and tidyverse, 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
给定这个数据框
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
调用。
这是另一个使用 lubridate and tidyverse, 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