сопоставить все вхождения во фрейме данных - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь сделать что-то похожее, как в этом посте здесь: Извлечь строки для первого вхождения переменной во фрейм данных , но извлечь все вхождения, а не только первое.

Вот упрощенный пример: у меня есть этот фрейм данных с именем toDrop

Gene   Taxa
123    A
327    B
445    D
557    A
789    E
123    B
557    C

Вот мой код, который использует совпадение и поэтому возвращает только первое совпадение. Я запускаю это внутри al oop, поэтому для простоты модифицирую здесь.

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 должен вернуть список «A» и «B», я думаю, что мне нужно использовать lapply как в этом посте , но не могу понять это из этого примера. Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Есть несколько способов сделать это. Один из способов в базе 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

. Возвращает список с двумя факторами. Этот метод может быть расширен до вектора 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]).

0 голосов
/ 16 апреля 2020
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 легко разбить столбец по значению и вернуть список. Поскольку вас интересует только столбец 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...