#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