r - 在 R 中,比较两个字符串列表,在第二个列表中找到第一个列表的每个元素的部分

标签 r subset

注意:我已更新问题以反射(reflect)数据中的特定模式。

假设我有两个向量。

   names_data <- c('A', 'B', 'C', 'D', 'E', 'F')
   levels_selected <- c('A1','A3', 'Blow', 'Bhigh', 'D(4.88e+03,9.18+e+04]', 'F')

我想知道如何获取向量、数据框、列表或其他任何东西,以检查级别向量并返回选择了哪些变量的级别。有句话说:
    A: 1, 3
    B: low, high
    D: (4.88e+03,9.18e+04]

最终,有一个数据框X其中names_data = names(data)levels_selected是每个变量中的一些水平,但不是全部。最后我想做的是使用 model.matrix 制作一个矩阵(例如,随机森林)我只想在 levels_selected 中包含变量和级别.有没有一种直接的方法呢?

最佳答案

我们可以在“levels_selected”('grp')中保留包含“names_data”的子字符串后创建一个分组变量,split使用 'grp' 删除前缀的子字符串得到 list .

grp <- sub(paste0("^(", paste(names_data, collapse="|"), ").*"), "\\1", levels_selected)
value <- gsub(paste(names_data, collapse="|"), "", 
               levels_selected)
lst <- split(value, grp)
lst
#$A
#[1] "1" "3"

#$B
#[1] "low"  "high"

#$D
#[1] "x"

如果我们的意思是这样的
library(qdapTools)
mtabulate(lst)
#  1 3 high low x
#A 1 1    0   0 0
#B 0 0    1   1 0
#D 0 0    0   0 1

或者另一种选择是使用 strsplit
d1 <- as.data.frame(do.call(rbind, strsplit(levels_selected,
      paste0("(?<=(", paste(names_data, collapse="|"), "))"), 
             perl=TRUE)), stringsAsFactors=FALSE)
aggregate(V2~V1, d1, FUN= toString)
#  V1        V2
#1  A      1, 3
#2  B low, high
#3  D         x

可能还有 model.matrix将是
model.matrix(~V1+V2-1, d1)

更新

通过使用 OP 的新示例
d1 <- as.data.frame(do.call(rbind, strsplit(levels_selected,
  paste0("(?<=(", paste(names_data, collapse="|"), "))"), 
         perl=TRUE)), stringsAsFactors=FALSE)
split(d1$V2, d1$V1) 
#$A
#[1] "1" "3"

#$B
#[1] "low"  "high"

#$D
#[1] "(4.88e+03,9.18+e+04]"

它也在使用第一种方法。

更新2

如果'names_data'中的元素后面没有字符,我们可以过滤掉它们
lst <- strsplit(levels_selected, paste0("(?<=(", paste(names_data, 
            collapse="|"), "))"), perl = TRUE)
d2 <-  as.data.frame(do.call(rbind,lst[lengths(lst)==2]), stringsAsFactors=FALSE)
split(d2$V2, d2$V1)
#$A
#[1] "1" "3"

#$B
#[1] "low"  "high"

#$D
#[1] "(4.88e+03,9.18+e+04]"

关于r - 在 R 中,比较两个字符串列表,在第二个列表中找到第一个列表的每个元素的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37234543/

相关文章:

r - 如何根据两个条件对数据进行子集化

r - 使用行名称的子集数据框

r - 自定义 tm_compass() 背景

r - 如何从 jpeg 图像中提取彩色点的坐标?

java - 如何仅生成整数列表的 3 个分区

types - Coq 程序配对

c++ - 生成具有偶数汉明权重的整数(popcount)c++

r - 使用 Dplyr 添加比例列

r - 在 R 中使用带有条件的 ifelse 进行变异

R包 "scholar"/获取文章的引用历史