根据另一列中的值选择一列中的元素

时间:2017-08-09 18:11:14

标签: r dataframe

我是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

2 个答案:

答案 0 :(得分:0)

为此,我们将尝试三个简单的阶段。

第1阶段:行选择

首先,我们会在数据框中选择行RefGene_Location包含所有三个短语5'UTR1stExonTSS1500,但不包含短语{{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")