我正在嘗試將一個函式應用于data.frameR 中的一列,以檢測是否存在特定的字串值。有各種字串模式,每種模式都構成了自己的分類。該函式應創建一個新列,dat$id_class該dat$id列根據列中的字串提供所述分類 ( ) 。
我依靠stringr和dplyr包來做到這一點。具體來說,我正在使用dplyr::mutate該功能。
此代碼運行并產生我正在尋找的確切結果,但我正在尋找更快的解決方案(如果存在)。這顯然是一個資料集有限的小規模示例,在我非常大的資料集上使用相同的方法所花費的時間比預期的要長得多。
library(stringi)
library(dplyr)
library(stringr)
dat <- data.frame(
id = c(
sprintf("%s%s%s", stri_rand_strings(1000000, 5, '[A-Z]'),
stri_rand_strings(5, 4, '[0-9]'), stri_rand_strings(5, 1, '[A-Z]'))
))
classify <- function(x){
if(any(stringr::str_detect(x,pattern = c('AA','BB')))){
'class_1'
} else if (any(stringr::str_detect(x,pattern = c('AB','BA')))){
'class_2'
} else {
'class_3'
}
}
dat <- dat %>% rowwise() %>% mutate(id_class = classify(id))
很有可能已經回答了這個問題,而且我只是沒有找對地方,但值得一試。
任何幫助表示贊賞!
uj5u.com熱心網友回復:
使用case_when該矢量,而不是做什么,rowwise用if/else變化與模式OR(|)
library(stringr)
library(dplyr)
system.time({
dat1 <- dat %>%
mutate(id_class = case_when(str_detect(id, 'AA|BB') ~'class_1',
str_detect(id, 'AB|BA') ~ 'class_2', TRUE ~ 'class_3'))
})
# user system elapsed
# 0.460 0.036 0.493
基于 OP 功能的計時
system.time({dat2 <- dat %>%
rowwise() %>%
mutate(id_class = classify(id))
})
# user system elapsed
# 31.927 0.303 32.891
- 檢查輸出
> all.equal(dat1, as.data.frame(dat2), check.attributes = FALSE)
[1] TRUE
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327578.html
下一篇:根據條件創建新變數
