Как проиндексировать фрейм данных, содержащий списки / векторы в качестве значений

#r #indexing #bioinformatics

#r #индексирование #биоинформатика

Вопрос:

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

У меня есть два списка генов, которые мне нужно сопоставить. В каждом списке гены названы как разные псевдонимы генов. Мне нужно запросить большой список генов, чтобы отфильтровать любые гены, которые не являются общими для двух наборов данных. Чтобы сделать это, я создал фрейм данных, который содержит все гены из обоих списков. Каждое значение во фрейме данных представляет собой либо одну строку, либо вектор из нескольких строк (псевдонимов). Отдельный столбец присваивает каждой группе псевдонимов уникальный номер, который я использую для сопоставления двух списков. Для каждого гена мне нужно проверить, присутствует ли он в фрейме данных. Но я не могу индексировать векторные значения. Смотрите ниже:

 df <- data.frame("col1"=I(list(c("MALAT1","FTK2","CAS9"),
                                 "MS4A6A",
                                 c("LACT1","FLEE6","LOC98"))),
                 "col2"=I(list(c("CASS4","MS4A2","NME"), 
                               "PLD3", 
                               "ADAM4")))
"MALAT1" %in% df$col1
[1] FALSE
"MS4A6A" %in% df$col1
[1] TRUE
 

Ответ №1:

Поскольку это так list , мы можем unlist

 "MALAT1" %in% unlist(df$col1)
#[1] TRUE
 

Причина, по которой возвращается второй TRUE элемент, заключается в том, что второй элемент равен length 1, а элемент с «MALAT1» — нет

-тестирование

Если мы изменим list элемент, содержащий один элемент, на «MALAT1»

 df$col1[2] <- "MALAT1"
"MALAT1" %in% df$col1
#[1] TRUE
 

Как правило, когда у нас есть list , если мы хотим протестировать каждый элемент

 lapply(df$col1, `%in%`, x = "LACT1")
#[[1]]
#[1] FALSE

#[[2]]
#[1] FALSE

#[[3]]
#[1] TRUE
 

Ответ №2:

Вот еще один обходной путь, который играет злую шутку df , сглаживая list s в столбцах через rapply toString

 df[] <- rapply(df, toString, how = "unlist")
 

такой, что

 > df
                 col1              col2
1  MALAT1, FTK2, CAS9 CASS4, MS4A2, NME
2              MS4A6A              PLD3
3 LACT1, FLEE6, LOC98             ADAM4
 

и затем вы можете использовать grepl , чтобы проверить, можно ли найти цель в столбце, например,

 > grepl("LACT1", df$col1, fixed = TRUE)
[1] FALSE FALSE  TRUE

> grepl("NME", df$col2, fixed = TRUE)
[1]  TRUE FALSE FALSE
 

Комментарии:

1. Большое спасибо! отличное решение

Ответ №3:

Вы были почти там. Просто unlist() оберните список, в котором у вас есть da