我是R的新学习者。目前,我正在研究一些新的450k数据。我有一些这样的数据:
IlmnID | RefGene_Location | RefGene_Name
------------- | ---------------------------------------------------------------| ----------------------------------------------
cg27656579 | Body;5'UTR;5'UTR;5'UTR | MIR5096;GNG4;GNG4;GNG4
cg03503114 | TSS1500;1stExon;1stExon;5'UTR;1stExon;5'UTR;5'UTR;5'UTR;1stExon| CAPZA1;ST7L;ST7L;ST7L;ST7L;ST7L;ST7L;ST7L;ST7L
RefGene_Location列中的元素对应于RefGene_Name列中的基因。我想要的是保留对应于" 5' UTR"," 1stExon" " TSS1500",但不是" Body"。最后,将它们编译成 结果如下:
IlmnID | RefGene_Name
----------- | ------------
cg27656579 | GNG4
cg03503114 | CAPZA1
cg03503114 | ST7L
答案 0 :(得分:0)
为此,我们将尝试三个简单的阶段。
第1阶段:行选择
首先,我们会在数据框中选择行RefGene_Location
包含所有三个短语5'UTR
,1stExon
和TSS1500
,但不包含短语{{1 }}。我假设您正在使用的数据帧称为`df
Body
第2阶段:基因名称
现在我们想要从df <- df[all(c("5'UTR", "1stExond", "TSS1500") %in% df$RefGene_Location) &
!"Body" %in% df$RefGene_Location, ]
列中获取基因名称。我将假设该名称始终出现在该列中最后一个RefGene_Name
之后的文本中,并将此;
列替换为此条目。
RefGene_Name
阶段3:摆脱多余的列
这只是因为数据格式与您在问题中提供的格式相同。我们不再需要您的数据集中的其他列,例如RefGene_Location,因此我们将删除这些列。
# Split df$RefGene_Name into chunks separated by ";", and keep the last chunk
df$RefGene_Name <- sapply(strsplit(df$RefGene_Name, ";"), function(x) x[length(x)])
答案 1 :(得分:0)
您可以使用tidyverse
包。首先拆分并取消列。过滤并删除重复项。
library(tidyverse)
df %>%
mutate_at(vars(-ID), funs(strsplit(., ';'))) %>%
unnest() %>%
filter(loc1 %in% v1) %>%
select(-loc1) %>%
unique()
由此给出,
ID name1 1 A GNG4 4 B CAPZA1 5 B ST7L
<强>其中,强>
v1 <- c("5'UTR", "1stExon" ,"TSS1500")
df <- structure(list(ID = c("A", "B"), loc1 = c("Body;5'UTR;5'UTR;5'UTR",
"TSS1500;1stExon;1stExon;5'UTR;1stExon;5'UTR;5'UTR;5'UTR;1stExon"
), name1 = c("MIR5096;GNG4;GNG4;GNG4", "CAPZA1;ST7L;ST7L;ST7L;ST7L;ST7L;ST7L;ST7L;ST7L"
)), .Names = c("ID", "loc1", "name1"), row.names = c(NA, -2L), class = "data.frame")