匹配数据框中的所有事件

match all occurrences in data frame

我正在尝试做与此处 post 中类似的事情:Extract rows for the first occurrence of a variable in a data frame 但提取所有出现的事件,而不仅仅是第一次出现的事件。

这是一个简化的例子: 我有一个名为 toDrop

的数据框
Gene   Taxa
123    A
327    B
445    D
557    A
789    E
123    B
557    C

这是我使用匹配的代码,因此 return 仅是第一个匹配项。我 运行 这是一个循环,所以为了简单起见,在这里修改一些东西。

Gene <- c("123", "327", "445", "557", "789", "123", "557")
Taxa <- c("A", "B", "D", "A", "E", "B", "C")
toDrop <- data.frame(Gene, Taxa)
Temp <- list()
geneNameTemp <- "123"
toDrop[match(geneNameTemp, toDrop$Gene), 2] -> Temp

在此示例中,Temp 应该 return "A" 和 "B" 的列表 我想我需要像 中那样使用 lapply 但无法从该示例中弄清楚。 感谢您的帮助。

Gene <- c("123", "327", "445", "557", "789", "123", "557")
Taxa <- c("A", "B", "D", "A", "E", "B", "C")
toDrop <- data.frame(Gene, Taxa, stringsAsFactors = FALSE)

有很多方法可以做到这一点。使用 data.table 可以很容易地按值拆分列和 return 列表。由于您只对 Taxa 列感兴趣,您可以执行以下操作:

library(data.table)
lapply(
  split(setDT(toDrop), by = "Gene"), function(d) d[['Taxa']]
)

$`123`
[1] "A" "B"

$`327`
[1] "B"

$`445`
[1] "D"

$`557`
[1] "A" "C"

$`789`
[1] "E"

有几种方法可以做到这一点。基本 R 中接近您已有的方法的一种方法是 which() 结合 %in%

Gene <- c("123", "327", "445", "557", "789", "123", "557")
Taxa <- c("A", "B", "D", "A", "E", "B", "C")
toDrop <- data.frame(Gene, Taxa)
Temp <- list()
geneNameTemp <- "123"
Temp <- as.list(toDrop[which(toDrop$Gene %in% geneNameTemp),2])
Temp
# [[1]]
# [1] A
# Levels: A B C D E
# 
# [[2]]
# [1] B
# Levels: A B C D E

请 return 列出包含两个因素的列表。这个方法可以扩展到vector geneNameTemp,但是如果有的话它会包含重复

Gene <- c("123", "327", "445", "557", "789", "123", "557")
Taxa <- c("A", "B", "D", "A", "E", "B", "C")
toDrop <- data.frame(Gene, Taxa)
Temp <- list()
geneNameTemp <- c("123", "327")
Temp <- as.list(toDrop[which(toDrop$Gene %in% geneNameTemp),2])
Temp
# [[1]]
# [1] A
# Levels: A B C D E
# 
# [[2]]
# [1] B
# Levels: A B C D E
# 
# [[3]]
# [1] B
# Levels: A B C D E

如果您只需要一个包含可以删除的因子的向量 as.list()。如果要删除重复项,可以使用 unique(toDrop[which(toDrop$Gene %in% geneNameTemp),2]).