gpt4 book ai didi

R:对文本变量进行分类

转载 作者:行者123 更新时间:2023-12-02 08:48:09 24 4
gpt4 key购买 nike

我有一个数据框,其中包含代表疾病诊断的字符串变量。我想根据一些规则对诊断进行分类:

rules <- list(
group1 = c('A012', 'A02', 'C30'),
group2 = c('B01', 'B02')
)

如果诊断字段包含“A01”、“A02”或“A03”(包括包含这些模式的文本,例如“A0199”),则该案例应放入第 1 组,依此类推。

我的数据如下所示:

dat <- data.frame(
ID = seq_len(10),
diagnosis = c('A012', 'A01', 'B23', 'C43', 'B023', 'A99', 'A023', 'B012', 'B04', 'A07')
)

我使用的方法如下:

# modify the rules so they work with grep    
rules <- lapply(rules, paste, collapse = '|')

# create a function that classifies an individual diagnosis
group <- function(y) {
a <- sapply(rules, grepl, x = y)
a <- names(a)[a]
return(if (length(a) == 0) NA else a)
}

# apply the function across the data frame
dat$group <- sapply(dat$diagnosis, group)

这似乎可行,但我的数据集很大,规则很多,而且速度非常慢!

有没有更快的方法可以做到这一点?

最佳答案

如果规则数量不太大(OP 说只有 40 个),我们可以运行规则并使用 stringi::stri_detect_fixed 执行精确匹配(这要快得多)比使用正则表达式)

首先,我们会奉承规则

rules_dt <- list(rules = unlist(rules, use.names = FALSE), 
grp = rep(seq_len(length(rules)), lengths(rules)))

然后,定义函数

library(stringi)
f <- function(x) dat[stri_detect_fixed(dat$diagnosis, rules_dt$rules[x]), "group"] <<- rules_dt$grp[x]

然后,按照规则运行它

invisible(lapply(seq_len(length(rules_dt[[1]])), f))
dat
# ID diagnosis group
# 1 1 A012 1
# 2 2 A02 1
# 3 3 B23 NA
# 4 4 C43 NA
# 5 5 B023 2
# 6 6 A99 NA
# 7 7 A023 1
# 8 8 B012 2
# 9 9 B04 NA
# 10 10 A07 NA
<小时/>

基准测试:在 0.5 毫米行和 10 组(每组 10 个)上,它在我的笔记本电脑上运行约 4 秒

library(stringi)
n <- 10
N <- 5e5

set.seed(123)
rules <- setNames(replicate(n,
stri_rand_strings(n = n, length = 4), simplify = FALSE),
paste0("group", 1:n))

dat <- data.frame(
ID = 1:N,
diagnosis = stri_rand_strings(N, 4),
stringsAsFactors = FALSE
)

system.time({
rules_dt <- list(rules = unlist(rules, use.names = FALSE),
grp = rep(seq_len(length(rules)), lengths(rules)))
invisible(lapply(seq_len(length(rules_dt[[1]])), f))
})

# user system elapsed
# 3.27 0.43 3.70

关于R:对文本变量进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50665625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com