虽然我在上一篇文章中收到了一些很好的反馈,但我认为我最初的问题并不完全清楚,因此,答案并没有产生预期的结果。
我有一个字符变量字符串的长向量,有大约600 K的观测值,有800个唯一的字符串值。我试图将这800个唯一字符串缩小到大约20个,基于另一个重要字符串变量向量。
下面是一个示例:
col1 <- c("CORE_I5-xxxx_6C_VPRO", "A6-xxxx_MB", "CORE_I7-xxxx_4C_VPRO_MB", "INTEL_CORE_I3_MB", NA)
col2 <- c("CORE_I5_VPRO", NA, "CORE_I7_VPRO", "INTEL_CORE_I3", NA)新列(col2)是根据以下字符变量(V)从旧列(col1)创建的,方法是保留V中包含的字符串:
V <- c("CORE", "INTEL", "I5", "I7", "I3", NA)我尝试了下面的代码,但它只给了我一部分字符串,而不是每个观察中的所有元素。
library(stringr)
col2 <- str_extract(col1, paste(V, collapse="|"))我也尝试了我的前一篇文章的建议,但不幸的是,我没有得到期望的输出。谢谢大家的帮助!
发布于 2022-06-30 21:13:47
这里我们创建x,然后使用grepl
library(stringr)
x <- str_replace_all(str_remove(S, '(\\d+\\_)'), '\\_', '')
x[grepl(paste0(V, collapse = "|"), x)][1] "INTELI5VPRO" "COREdfds" "VPROLI9" 发布于 2022-06-30 21:07:50
您可以遵循最初的方法,但可以使用str_extract_all和sapply(),如下所示:
sapply(str_extract_all(S, paste(V, collapse = "|")),paste0, collapse="")输出
[1] "INTELI5VPRO" "CORE" "" "VPROI9" "NA" 或者,你可以这样做:
lapply(S, \(s) {
x = strsplit(s, "_")[[1]]
result = paste0(x[x %in% V], collapse="")
ifelse(result=="", as.character(NA),result)
}) %>% unlist()输出
[1] "INTELI5VPRO" "CORE" NA "I9" NA 发布于 2022-06-30 21:30:16
您可能希望使用str_extract_all并处理位置3中的空提取(基于您的代码):
sapply(str_extract_all(S, paste(V, collapse = "|")),
function(x) ifelse(length(x) != 0, str_flatten(x), NA)
)
#> [1] "INTELI5VPRO" "CORE" NA "VPROI9" NA https://stackoverflow.com/questions/72821910
复制相似问题