如何将 table 条目与 R 中第二个 table 的列表条目相匹配?
How do I match table entries to a second table's list entries in R?
我有两个table,table1有一列字符串。我想在另一个 table、table2 中找到每个字符串的匹配项,但在相应的 table2 列中,每个单元格包含每行条目的列表。
到目前为止,我已经弄清楚如何使用 grepl 来匹配特定的条目:
grepl(table1$label[i],table2$labels[[j]][k])
对于一些 i、j 和 k。 i 和 j 是固定的,因为它们分别是 table 1 和 table 2 中的行数,但是 k 是一些正值,所以我有这样的东西:
for (i in 1:nrow(table1)){
for (j in 1:nrow(table2){
for(k ?){
grepl(table1$label[i],table2$labels[[j]][k])
}
}
}
我不太确定要为 k 循环添加什么。
一旦我确定了包含 table1 个字符串的 table2 行,我想做的是报告来自不同 table 的相应值2 列并将它们追加回 table1 中相应的字符串行,所以我猜我将需要更多的 for 循环...是否有解决诸如此类的多重引用问题的捷径?
一些示例数据(请注意 table2 列表中也有缺失值,但我假设在匹配这些值时会被忽略,其他条目是字符 class):
Table 1
label
1 Tom
2 Gemma
3 Graham
Table 2(更新)
item labels
1 Apple Tom, ,John, ,Terry,
2 Orange Bryan, ,Graham,
3 Pear Finn, ,Gemma, ,Graham,
输出
Table 1
label item
1 Tom Apple
2 Gemma Pear
3 Graham Orange, Pear
通过使用 dput
我得到
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) 例如
Table 2(版本 2)
item labels
1 Apple Tom, ,John, ,Terry,
2 Orange Bryan, ,Graham,
3 Pear Finn, ,Gemma, ,Graham Green,
输出 Table1 是一样的。
这是使用 data.table
包
的尝试
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
您可以将代码修改为
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
这是一个 qdapTools 方法,它在后端使用 data.table。您的数据类型有点不明确。 dput
在这里会有所帮助。
我相信你的数据是基于 NA 的评论
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')
)
现在查找值:
library(qdapTools)
Table1[["item"]] <- lapply(Table1[[1]], lookup, key)
## label item
## 1 Tom Apple
## 2 Gemma Pear
## 3 Graham Orange, Pear
如果你有 data.frame
那么试试:
key2 <- data.frame(x = names(key))
key2[["item"]] <- key
Table1[["item2"]] <- lapply(Table1[[1]], lookup, setNames(as.list(key2[[2]]), key2[[1]]))
如果该列确实是一个 collapsed/pasted 向量:
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]]))
我有两个table,table1有一列字符串。我想在另一个 table、table2 中找到每个字符串的匹配项,但在相应的 table2 列中,每个单元格包含每行条目的列表。
到目前为止,我已经弄清楚如何使用 grepl 来匹配特定的条目:
grepl(table1$label[i],table2$labels[[j]][k])
对于一些 i、j 和 k。 i 和 j 是固定的,因为它们分别是 table 1 和 table 2 中的行数,但是 k 是一些正值,所以我有这样的东西:
for (i in 1:nrow(table1)){
for (j in 1:nrow(table2){
for(k ?){
grepl(table1$label[i],table2$labels[[j]][k])
}
}
}
我不太确定要为 k 循环添加什么。
一旦我确定了包含 table1 个字符串的 table2 行,我想做的是报告来自不同 table 的相应值2 列并将它们追加回 table1 中相应的字符串行,所以我猜我将需要更多的 for 循环...是否有解决诸如此类的多重引用问题的捷径?
一些示例数据(请注意 table2 列表中也有缺失值,但我假设在匹配这些值时会被忽略,其他条目是字符 class):
Table 1
label
1 Tom
2 Gemma
3 Graham
Table 2(更新)
item labels
1 Apple Tom, ,John, ,Terry,
2 Orange Bryan, ,Graham,
3 Pear Finn, ,Gemma, ,Graham,
输出
Table 1
label item
1 Tom Apple
2 Gemma Pear
3 Graham Orange, Pear
通过使用 dput
我得到
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) 例如
Table 2(版本 2)
item labels
1 Apple Tom, ,John, ,Terry,
2 Orange Bryan, ,Graham,
3 Pear Finn, ,Gemma, ,Graham Green,
输出 Table1 是一样的。
这是使用 data.table
包
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
您可以将代码修改为
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
这是一个 qdapTools 方法,它在后端使用 data.table。您的数据类型有点不明确。 dput
在这里会有所帮助。
我相信你的数据是基于 NA 的评论
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')
)
现在查找值:
library(qdapTools)
Table1[["item"]] <- lapply(Table1[[1]], lookup, key)
## label item
## 1 Tom Apple
## 2 Gemma Pear
## 3 Graham Orange, Pear
如果你有 data.frame
那么试试:
key2 <- data.frame(x = names(key))
key2[["item"]] <- key
Table1[["item2"]] <- lapply(Table1[[1]], lookup, setNames(as.list(key2[[2]]), key2[[1]]))
如果该列确实是一个 collapsed/pasted 向量:
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]]))