合并 R 列表中的字符串向量

2023-12-12

我有一组字符串以及 ID:string 格式的相应 ID 作为向量列表R

d <- list( c("SD1:LUSH", "SD44:CANCEL", "SD384:FR563", "SD32:TRUMPET"), c("SD23:SWITCH", "SD1:LUSH", "SD567:TREK"), c("SD42:CRAYON", "SD345:FOX", "SD183:WIRE"), c("SD345:HOLE", "SD340:DUST", "SD387:ROLL"), c("SD455:TOMATO", "SD39:MATURE"), c("SD12:PAINTING", "SD315:MONEY31", "SD387:SPRING"),  c("SD32:TRUMPET", "SD1:FIELD"))

[[1]]
[1] "SD1:LUSH"     "SD44:CANCEL"  "SD384:FR563"  "SD32:TRUMPET"

[[2]]
[2] "SD23:SWITCH" "SD1:LUSH"    "SD567:TREK" 

[[3]]
[3] "SD42:CRAYON" "SD345:FOX"   "SD183:WIRE" 

[[4]]
[4] "SD345:HOLE" "SD340:DUST" "SD387:ROLL"

[[5]]
[5] "SD455:TOMATO" "SD39:MATURE" 

[[6]]
[6] "SD12:PAINTING" "SD315:MONEY31"    "SD387:SPRING" 

[[7]]
[7] "SD32:TRUMPET" "SD1:FIELD" 

我想按 ID 合并向量。具有共同ID的向量需要合并,同时保留其对应的字符串以形成新的向量。可以在此类合并字符串中删除重复的 ID:String 组合。总数据包含大约 2000 个这样的向量。样本数据的期望输出是

out <- c("SD1:LUSH, SD1:FIELD,  SD23:SWITCH, SD32:TRUMPET, SD44:CANCEL, SD384:FR563,  SD567:TREK", "SD12:PAINTING, SD42:CRAYON, SD183:WIRE, SD340:DUST SD345:FOX, SD345:HOLE, SD387:SPRING, SD387:ROLL", "SD455:TOMATO, SD39:MATURE") 

[1] "SD1:LUSH, SD1:FIELD,  SD23:SWITCH, SD32:TRUMPET, SD44:CANCEL, SD384:FR563,  SD567:TREK"            
[2] "SD12:PAINTING, SD42:CRAYON, SD183:WIRE, SD315:MONEY31, SD340:DUST SD345:FOX, SD345:HOLE, SD387:SPRING, SD387:ROLL"
[3] "SD455:TOMATO, SD39:MATURE"

我尝试将其转换为data.frame to use merge(),但发现没有用。是否可以首先使用字符串的 ID 部分搜索交集,然后搜索相应向量的并集。我尝试过使用intersect() and union(),但我未能仅使用向量的 ID 部分。

我对编写 R 脚本相当陌生。

Update As @CarlWitthoft pointed out, I am trying to make the match condition for merging more clear with this image. Match criteria

简而言之,我想合并在 SDxyz:___ 方面有交集的向量,或者尝试获取重叠字符串向量的并集。

解决了!!


创建一个 data.table 块,其中一列包含原始组,另一列包含分隔的 id

d <- list( c("SD1:LUSH", "SD44:CANCEL", "SD384:FR563", "SD32:TRUMPET"), c("SD23:SWITCH", "SD1:LUSH", "SD567:TREK"), c("SD42:CRAYON", "SD345:FOX", "SD183:WIRE"), c("SD345:HOLE", "SD340:DUST", "SD387:ROLL"), c("SD455:TOMATO", "SD39:MATURE"), c("SD12:PAINTING", "SD315:MONEY31", "SD387:SPRING"),  c("SD32:TRUMPET", "SD1:FIELD"))
d2 <-  lapply(d, function(x) sapply(strsplit(x, ":"), "[", 1))

d <- lapply(d, paste0, collapse=", ")
d2 <- lapply(d2, paste0, collapse=", ")

d <- as.data.frame(as.matrix(lapply(d, paste0, collapse=", ")))
d2 <- as.data.frame(as.matrix(lapply(d2, paste0, collapse=", ")))

d <- as.data.frame(cbind(d,d2))
colnames(d) <- c("sdw", "sd")
d$sd <- as.character(d$sd)
d$sdw <- as.character(d$sdw)

require(data.table)

Bloc <- data.table( d , key = "sd" )

获取 Bloc 中的所有 id 以及相应的数据

Bloc <- Bloc[ , list( ID = unlist( strsplit( sd , "," ) ) ) , by = list(sdw, sd) ]
Bloc$ID <- gsub("^\\s+|\\s+$", "", Bloc$ID)
Bloc <- data.table( Bloc , key = "ID" )

循环合并 id 相交的向量

Bloc <- as.data.frame(Bloc)
M <- nrow(Bloc)
#create blankd data.frame
G <- data.frame(matrix(ncol=3), stringsAsFactors=FALSE)
G[,1:3] <- as.character(G[,1:3])
#G <- data.frame(sdw=character(), sd=character(), ID= character())
colnames(G) <- c("sdw", "sd", "ID")
N <- M
mch <- as.data.frame(Bloc)
#Loop to sequentially fill data.frame
for (i in 1:M) {
  # test if ID already in previous groups
  if(Bloc[i,"ID"] %in% G$ID == FALSE) { 
    # convert element to vector to check for intersect
    tm <- strsplit(x=Bloc[i, "sd"], split=", ")
    mch$t <- numeric(length=M)
  }
  for (j in 1:N){
    #if intersect exists apply code as 1 mch$t column
    ff <- strsplit(x=mch[j, "sd"], split=", ")[[1]]
    dd <- intersect (tm[[1]], ff)
    if (identical(dd, character(0))== FALSE) mch[j,"t"] = 1
  }
  submch <- subset(mch, t == 1 )
  ID <- submch$ID
  Group1 <- sort((unlist(strsplit(paste0(submch$sdw, collapse=","), ","))))
  Group1 <- unique(gsub(" ","", Group1))
  sdw <- rep(paste0(Group1, collapse=", "), nrow(submch))
  Group2 <- sort((unlist(strsplit(paste0(submch$sd, collapse=","), ","))))
  Group2 <- unique(gsub(" ","", Group2))
  sd <- rep(paste0(Group2, collapse=", "), nrow(submch))
  G1 <- cbind(sdw, sd, ID)
  G1 <- unique(G1)
  G <- rbind(G, G1)
  mch$t <- NULL
}

G <- unique(G)
G2 <- data.table(G, key="ID")
G2 <- G2[, list(sdw = paste0(sort(unique(unlist(strsplit(sdw, split=", ")))), collapse=", "), 
                sd = paste0(sort(unique(unlist(strsplit(sd, split=", ")))), collapse=", "))  , by = "ID"]
G2 <- data.table( G2, key=c("sd", "sdw"))
G2 <- unique(G2)

获取输出为 data.table

Bloc <- G2[-1,]
Bloc$ID <- NULL

重复上面的循环,直到不再有交集为止

repeat
{
  N1 <- nrow(Bloc)
  Bloc <- Bloc[ , list( ID = unlist( strsplit( sd , "," ) ) ) , by = list(sdw, sd) ]
  Bloc$ID <- gsub("^\\s+|\\s+$", "", Bloc$ID)
  Bloc <- data.table( Bloc , key = "ID" )

  Bloc <- as.data.frame(Bloc)
  M <- nrow(Bloc)
  #create blankd data.frame
  G <- data.frame(matrix(ncol=3), stringsAsFactors=FALSE)
  G[,1:3] <- as.character(G[,1:3])
  #G <- data.frame(sdw=character(), sd=character(), ID= character())
  colnames(G) <- c("sdw", "sd", "ID")
  N <- M
  mch <- as.data.frame(Bloc)
  #Loop to sequentially fill data.frame
  for (i in 1:M) {
    # test if ID already in previous groups
    if(Bloc[i,"ID"] %in% G$ID == FALSE) { 
      # convert element to vector to check for intersect
      tm <- strsplit(x=Bloc[i, "sd"], split=", ")

      mch$t <- numeric(length=M)
    }
    for (j in 1:N){
      #check if intersect exists and code accordingly
      ff <- strsplit(x=mch[j, "sd"], split=", ")[[1]]
      dd <- intersect (tm[[1]], ff)
      if (identical(dd, character(0))== FALSE) mch[j,"t"] = 1
    }
    submch <- subset(mch, t == 1 )
    ID <- submch$ID
    Group1 <- sort((unlist(strsplit(paste0(submch$sdw, collapse=","), ","))))
    Group1 <- unique(gsub(" ","", Group1))
    sdw <- rep(paste0(Group1, collapse=", "), nrow(submch))
    Group2 <- sort((unlist(strsplit(paste0(submch$sd, collapse=","), ","))))
    Group2 <- unique(gsub(" ","", Group2))
    sd <- rep(paste0(Group2, collapse=", "), nrow(submch))
    G1 <- cbind(sdw, sd, ID)
    G1 <- unique(G1)
    G <- rbind(G, G1)
    mch$t <- NULL
  }

  G <- unique(G)
  G2 <- data.table(G, key="ID")

  G2 <- G2[, list(sdw = paste0(sort(unique(unlist(strsplit(sdw, split=", ")))), collapse=", "), 
                  sd = paste0(sort(unique(unlist(strsplit(sd, split=", ")))), collapse=", "))  , by = "ID"]
  G2 <- data.table( G2, key=c("sd", "sdw"))
  G2 <- unique(G2)
  Bloc <- G2[-1,]
  Bloc$ID <- NULL
  N2 <- nrow(Bloc)  
if (N1 == N2)
break
}

Output

Bloc$sdw

[1] "SD1:FIELD, SD1:LUSH, SD23:SWITCH, SD32:TRUMPET, SD384:FR563, SD44:CANCEL, SD567:TREK"                              
[2] "SD12:PAINTING, SD183:WIRE, SD315:MONEY31, SD340:DUST, SD345:FOX, SD345:HOLE, SD387:ROLL, SD387:SPRING, SD42:CRAYON"
[3] "SD39:MATURE, SD455:TOMATO"  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合并 R 列表中的字符串向量 的相关文章

随机推荐

  • 如何使用JavaScript控制音频元素

    首先 我尝试不使用默认的 html5 标准控件 如果可能的话我很乐意使用 jQuery 但我暂时将其删除 因为我不确定问题是什么 目前我只是想有一个播放按钮 单击后会播放一 些音乐 该按钮将更改为暂停按钮 一旦点击这个暂停按钮 音乐就会明显
  • BottomNavigationView 不存在

    我正在尝试将 navigationeditor 与底部导航视图一起使用 但似乎底部导航视图只是导致问题的原因 这是我的 xml
  • 将平面数组中的每个字符串复制 N 次

    我想将每个值重复 3 次并按正确的顺序排列 应使用其自身的 3 个副本来代替每个原始元素 给定以下一维字符串数组 chars a b c 所以结果是 duplicatedChars a a a b b b c c c 我尝试过与str re
  • Gradle 如何从 apk 中排除文件

    我将密钥库存储在资产目录中 如何在构建中排除它以创建 apk 我以这种方式尝试过 但仍然存在 android packagingOptions exclude META INF LICENSE txt exclude assets keys
  • 如何向 EF Core 中的所有实体添加相同的列?

    想象一下 我想向我的所有实体添加 IsDeleted 列或一些审核列 我可以创建一个基类 我的所有实体都将继承该基类 这将解决我的问题 但是我无法指定创建列的顺序 因此我最终会在实体的字段之前得到所有审核字段 这是我不想要的 我希望他们位于
  • 程序最小化后无法从任务栏检索

    我将提供一些关于我正在尝试做的事情的背景 我创建了一个自定义按钮 该按钮应该通过淡出动画最小化我的窗口 因此它的代码如下 private void minimize Window object sender EventArgs e var
  • 同一变量“args”有两个不同的值

    我正在从 python 脚本调用一个方法 其中一个变量作为 args 一旦我进入该方法 当我尝试查看变量 args 的值时 print args 并且仅执行 args 会显示两个不同的值 谁能告诉我这两个命令有什么区别 我希望这两个命令显示
  • javascript大整数舍入是因为精度? (为什么?)

    如果你这样做 for var i 0 i lt 30 i console log i 78764357878563800 console log 78764357878563790 i 78764357878563800 您开始比较从 78
  • GNU make 似乎忽略了中间文件的非终端匹配规则

    我的目录中有以下文件 FP01 c include
  • 禁用有关在派生类的复制构造函数内显式初始化基构造函数的警告

    我正在使用启用了 Wextra 的 g 版本 4 2 1 我包含来自库的标头 并且不断收到有关库中某个类的以下警告 该警告由 Wextra 启用 我已将类的实际名称替换为 BaseClass warning base class class
  • 找到 setTimeout() 中剩余的时间?

    我正在编写一些与我不拥有的库代码交互的Javascript 并且无法 合理地 更改 它创建 Javascript 超时 用于显示一系列限时问题中的下一个问题 这不是真正的代码 因为它被完全混淆了 这是图书馆正在做的事情 setup a ti
  • 帮助推文媒体实体

    我刚刚发现推文实体 我想将其添加到我的推文中 我已经读了一遍又一遍的API 但我仍然无法让它工作 这就是我所拥有的 entities array media url gt picture url url gt short url type
  • g++:如何整理导出的符号

    我正在尝试编译一个使用 JNI 的 Java 库 当我启动程序时 我看到崩溃并出现 UnsatisfiedLinkError 它表示在 DLL 中找不到特定方法 经过仔细检查 我发现我用于编译和链接的 g 通过在方法名称中添加 8 或 16
  • 分配的指针字段变为

    我有一个结构 type user struct Id string data ptr userData 我在全局范围内存储用户的一部分 type Hall struct users user var hall Hall global 最后
  • 使用 AVX2 向量化随机初始化并使用十进制数字数组打印 BigInt?

    如何将我的代码传递给 AVX2 代码并获得与以前相同的结果 是否可以使用 m256i在 LongNumInit 中 LongNumPrint 函数代替uint8 t L 或某种类似类型的变量 我对 AVX 的了解相当有限 我调查了很多 但是
  • 当我写入超出数组末尾时,为什么不会出现分段错误?

    为什么我编译时没有给出错误 include
  • 朱莉娅,加速评估

    Julia 有一个非常好的功能 可以访问自己的语法树 这使得以编程方式生成新函数变得很容易 但它比普通的 Julia 代码慢得多 例如 julia gt timing time for i in 1 100 tan pi 2 rand en
  • 如何在目标C中以相反的顺序显示数组[重复]

    这个问题在这里已经有答案了 我想以相反的顺序在 UITableView 中显示数据 我几乎不费吹灰之力就能做到这一点 但任何人都可以提供更好的方法来做到这一点 提前致谢 Use NSArray reverseObjectEnumerator
  • 计算两个Python字典中包含的键的差异

    假设我有两个 Python 字典 dictA and dictB 我需要查明是否存在任何密钥dictB但不在dictA 最快的方法是什么 我应该将字典键转换为一组然后继续吗 有兴趣了解您的想法 感谢您的回复 抱歉没有正确陈述我的问题 我的情
  • 合并 R 列表中的字符串向量

    我有一组字符串以及 ID string 格式的相应 ID 作为向量列表R d lt list c SD1 LUSH SD44 CANCEL SD384 FR563 SD32 TRUMPET c SD23 SWITCH SD1 LUSH SD