另一种基本 R 方法可能是:
vapply(strsplit(gsub("(\\$|,| and up)", "", df$family_income), " to ", TRUE),
function(x) mean(as.integer(x)), numeric(1L))
这与 Ronak Shah 的 stringr + purrr 方法一样快,甚至比目前共享的现有基本 R 方法更快。
如果需要更高的效率,可以考虑编写如下函数:
library(data.table)
parse_income <- function(instring) {
as.data.table(instring)[
, temp := gsub("(\\$|,| and up)", "", instring)][
, c("v1", "v2") := tstrsplit(temp, " to ", fixed = TRUE, type.convert = TRUE)][
, rowMeans(.SD, na.rm = TRUE), .SDcols = c("v1", "v2")]
}
然后可以这样使用:
parse_income(df$family_income)
## [1] 87499.5 62499.5 4999.5 200000.0 112499.5
这是一个从 Ronak Shah 回答中的样本数据开始的快速基准测试。待解析的数据已扩展至10,000个值。
inc <- rep(df$family_income, 1e4/nrow(df)) # Adjust to get a sense of how each approach scales
base_am <- function(instring) {
vapply(strsplit(gsub("(\\$|,| and up)", "", instring), " to ", TRUE),
function(x) mean(as.integer(x)), numeric(1L))
}
base_rs <- function(instring) {
temp <- gsub(",", "", instring)
sapply(regmatches(temp, gregexpr("\\d+", temp)), function(x) mean(as.numeric(x)))
}
base_hf <- function(instring) {
do.call("rbind",
lapply(strsplit(gsub("[[:alpha:]]|\\s+", "",
gsub(" to ", ":",
gsub("[[:punct:]]", "", instring))), ":"),
function(x){mean(as.numeric(x))}))
}
stringi_rs <- function(instring) {
purrr::map_dbl(str_extract_all(str_replace_all(instring, ",", ""), "\\d+"), ~mean(as.numeric(.x)))
}
bench::mark(base_am(inc), base_rs(inc), base_hf(inc), stringi_rs(inc), parse_income(inc), check = FALSE)
## # A tibble: 5 x 13
## expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time result memory time gc
## <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm> <list> <list> <list> <list>
## 1 base_am(inc) 48ms 49.5ms 20.1 312.69KB 2.01 10 1 498ms <dbl [10,000]> <df[,3] [4 × 3… <bch:… <tibble [11…
## 2 base_rs(inc) 99.4ms 127.6ms 8.38 80.04MB 2.79 3 1 358ms <dbl [10,000]> <df[,3] [20,01… <bch:… <tibble [4 …
## 3 base_hf(inc) 67.1ms 68.4ms 14.4 547.2KB 2.06 7 1 485ms <dbl[,1] [10,000… <df[,3] [7 × 3… <bch:… <tibble [8 …
## 4 stringi_rs(inc) 50.3ms 51.8ms 19.1 324.16KB 2.12 9 1 472ms <dbl [10,000]> <df[,3] [38 × … <bch:… <tibble [10…
## 5 parse_income(inc) 14.8ms 15ms 66.1 1.01MB 0 34 0 514ms <dbl [10,000]> <df[,3] [30 × … <bch:… <tibble [34…