Unlist несколько значений в столбце dataframe, но отслеживать номер строки
У меня есть фрейм данных, который содержит столбец с несколькими значениями, состоящими из синонимов имени гена, разделенных точкой с запятой:
score <- c("32.01","19.5","18.0")
symbol <- c("30 kDa adipocyte complemen related protein","AAT1","Cachectin")
synonym <- c("30 kDa adipocyte complemen related protein; 30 kDa adipocyte complement-related protein; ACDC; ACRP30; ADIPOQ; APM-1; APM1; Adipocyte C1Q and collagen domain containing","AAT1; AAT1; ALT-1; ALT1; Alanine aminotransferase; Alanine aminotransferase 1; GPT 1; GPT1; Glutamate pyruvate transaminase; Glutamic--alanine transaminase 1; Glutamic--pyruvic transaminase 1","Cachectin; TNF alpha; TNF-a; TNFA; TNFSF-2; TNFSF2; TNFalpha; Tumor necrosis factor; Tumor necrosis factor ligand superfamily member 2; Tumor necrosis factor precursor; tumor necrosis factor alpha")
df <- data.frame(score, symbol, synonym, stringsAsFactors=FALSE)
Это необработанный вывод данных. Я сопоставляю официальные генные символы в данных с идентификаторами Entrez. Столбец символов часто не содержит генного символа, поэтому я должен извлечь все синонимы (обычно в списке есть официальный символ). Моя цель - отслеживать номера строк, чтобы после сопоставления всех символов с идентификаторами Entrez я мог идентифицировать те строки, которые не были сопоставлены.
В настоящее время я использую strsplit и unlist, чтобы разобрать синонимы, но я теряю, из какой строки пришел каждый синоним:
tmp <- data.frame(unlist(strsplit(as.character(df$synonym), "; ")))
Что я хочу, это то, что выглядит следующим образом:
originalRow <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3)
cbind(tmp, originalRow)
synonym originalRow
1 30 kDa adipocyte complemen related protein 1
2 30 kDa adipocyte complement-related protein 1
3 ACDC 1
4 ACRP30 1
5 ADIPOQ 1
6 APM-1 1
7 APM1 1
8 Adipocyte C1Q and collagen domain containing 1
9 AAT1 2
10 AAT1 2
11 ALT-1 2
12 ALT1 2
13 Alanine aminotransferase 2
14 Alanine aminotransferase 1 2
15 GPT 1 2
16 GPT1 2
17 Glutamate pyruvate transaminase 2
18 Glutamic--alanine transaminase 1 2
19 Glutamic--pyruvic transaminase 1 2
20 Cachectin 3
21 TNF alpha 3
22 TNF-a 3
23 TNFA 3
24 TNFSF-2 3
25 TNFSF2 3
26 TNFalpha 3
27 Tumor necrosis factor 3
28 Tumor necrosis factor ligand superfamily member 2 3
29 Tumor necrosis factor precursor 3
30 tumor necrosis factor alpha 3
Любой совет будет принят во внимание!
2 ответа
Здесь вы можете разбить каждую строку, объединить значения строки с ее номером в data.frame, а затем связать все эти data.frames вместе. Вы можете сделать это с
do.call("rbind", Map(data.frame,
synonym=strsplit(as.character(df$synonym), ";"),
origRow=seq_along(df$synonym))
)
Другой подход заключается в сохранении синонимов в списке, который затем можно перебрать для сравнения с массивом символов. Работа внутри одного элемента списка устраняет необходимость отслеживать исходный номер строки. Это также урезает пробелы для сравнения.
lst <- lapply(synonym, function(x) trimws(unlist(strsplit(x, ";"))))
lapply(lst, setdiff, symbol) # return values not in symbol array
[[1]]
[1] "30 kDa adipocyte complement-related protein" "ACDC"
[3] "ACRP30" "ADIPOQ"
[5] "APM-1" "APM1"
[7] "Adipocyte C1Q and collagen domain containing"
[[2]]
[1] "ALT-1" "ALT1" "Alanine aminotransferase"
[4] "Alanine aminotransferase 1" "GPT 1" "GPT1"
[7] "Glutamate pyruvate transaminase" "Glutamic--alanine transaminase 1" "Glutamic--pyruvic transaminase 1"
[[3]]
[1] "TNF alpha" "TNF-a"
[3] "TNFA" "TNFSF-2"
[5] "TNFSF2" "TNFalpha"
[7] "Tumor necrosis factor" "Tumor necrosis factor ligand superfamily member 2"
[9] "Tumor necrosis factor precursor" "tumor necrosis factor alpha"