首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将表条目与R中第二个表的列表项匹配?

如何将表条目与R中第二个表的列表项匹配?
EN

Stack Overflow用户
提问于 2015-06-04 18:53:48
回答 2查看 298关注 0票数 2

我有两个表,table1有一个字符串列。我希望在另一个表table2中找到每个字符串的匹配,但是在相应的table2列中,每个单元格都包含每一行条目的列表。

到目前为止,我已经知道了如何使用grepl来匹配特定的条目:

代码语言:javascript
复制
grepl(table1$label[i],table2$labels[[j]][k])

对于某些i、j和k. i和j是固定的,因为它们分别是表1和表2中的行数,但k是一些正值,所以我有如下所示:

代码语言:javascript
复制
for (i in 1:nrow(table1)){
  for (j in 1:nrow(table2){
    for(k ?){
    grepl(table1$label[i],table2$labels[[j]][k])
    }
  }
}

我不太清楚在k循环中该放什么。

一旦我确定了包含table2字符串的table1行,我想要做的是报告来自不同table2列的相应值,并将这些值追加到table1中的相应字符串行,所以我猜我还需要一些for循环.这样的多个引用问题有什么快捷方式吗?

一些示例数据(注意,table2列表中也有缺失的值,但我假设当匹配这些值被忽略时,其他条目是字符类):

表1

代码语言:javascript
复制
    label 
1   Tom     
2   Gemma     
3   Graham     

表2(更新)

代码语言:javascript
复制
     item      labels 
1    Apple     Tom, ,John, ,Terry,     
2    Orange    Bryan, ,Graham,  
3    Pear      Finn, ,Gemma, ,Graham, 

输出

表1

代码语言:javascript
复制
    label   item
1   Tom     Apple
2   Gemma   Pear  
3   Graham  Orange, Pear

通过使用dput我得到

代码语言:javascript
复制
Table1 <- structure(list(label = c("Tom", "Gemma", "Graham")), .Names = "label", 
class = "data.frame", row.names = c(NA, 
-3L))


Table2 <- structure(list(item = c("Apple", "Orange", "Pear"), labels = list(
    structure(c("Tom", "", "John", "", "Terry", ""), .Dim = c(6L, 
    1L)), structure(c("Bryan", "", "Graham", ""), .Dim = c(4L, 
    1L)), structure(c("Finn", "", "Gemma", "", "Graham", ""), .Dim = c(6L, 
    1L)))), .Names = c("item", "labels"), row.names = c(NA, -3L
), class = "data.frame")

增编:关于我最初使用grepl的问题,Table2中的一些标签与Table1中的标签只有部分匹配,但是在Table1中名称是唯一的,所以我想应用Table1标签,例如Graham (Table1)和Graham (Table2)和Graham Green (Table2)。

表2 (version2)

代码语言:javascript
复制
     item      labels 
1    Apple     Tom, ,John, ,Terry,     
2    Orange    Bryan, ,Graham,  
3    Pear      Finn, ,Gemma, ,Graham Green, 

输出Table1将是相同的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-04 20:01:36

下面是使用data.table包的一次尝试

代码语言:javascript
复制
library(data.table)
res <- setDT(Table2)[, list(label = unlist(labels)), by = item]
setkey(res, label)[Table1, toString(unique(item)), by = .EACHI]
#     label         item
# 1:    Tom        Apple
# 2:  Gemma         Pear
# 3: Graham Orange, Pear

我在这里所做的基本上是将labels拆分为Table2中的每一项。然后,在执行二进制左联接时,我将每个标签的唯一项聚合回Table1

编辑用于新的Table2,您可以将代码修改为

代码语言:javascript
复制
res <- setDT(Table2)[, list(label = unlist(labels)), by = item]
Table1["item"] <- sapply(Table1$label, function(x) toString(unique(res[grepl(x, label), item])))
Table1
#    label         item
# 1    Tom        Apple
# 2  Gemma         Pear
# 3 Graham Orange, Pear
票数 4
EN

Stack Overflow用户

发布于 2015-06-04 20:23:33

下面是一种qdapTools方法,它在后端使用data.table。您的数据类型有点模糊。dput在这里会很有帮助。

我相信你的数据是基于NA的评论

代码语言:javascript
复制
Table1 <- read.table(text="   label 
1   Tom     
2   Gemma     
3   Graham", header=TRUE)


key <- list(
    Apple  = c('Tom', NA, 'John', NA, 'Terry'),
    Orange =  c('Bryan', 'Graham'),
    Pear =  c('Finn', 'Gemma', NA, 'Graham')
)

现在查找值:

代码语言:javascript
复制
library(qdapTools)
Table1[["item"]] <- lapply(Table1[[1]], lookup, key)

##    label         item
## 1    Tom        Apple
## 2  Gemma         Pear
## 3 Graham Orange, Pear

如果您有一个data.frame,那么尝试:

代码语言:javascript
复制
key2 <- data.frame(x = names(key))
key2[["item"]] <- key

Table1[["item2"]] <- lapply(Table1[[1]], lookup, setNames(as.list(key2[[2]]), key2[[1]]))

如果列确实是折叠/粘贴的向量:

代码语言:javascript
复制
key2 <- data.frame(x = names(key))
key2[["item"]] <- lapply(key, paste, collapse=", ")
Table1[["item2"]] <- lapply(Table1[[1]], lookup, setNames(strsplit(as.character(key2[[2]]), "\\s*,\\s*"), key2[[1]]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30651879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档