匹配数据框中的所有事件
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])
.
我正在尝试做与此处 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" 的列表
我想我需要像
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])
.