首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在df2中识别df1中的元素,然后使用R在df2中的重合行中添加列

在df2中识别df1中的元素,然后使用R在df2中的重合行中添加列
EN

Stack Overflow用户
提问于 2020-08-08 18:05:43
回答 2查看 55关注 0票数 0

我有一个有两列的数据帧(基因组)和一个有一列的数据帧(list_SSNP)。

我尝试做的是在我的基因组数据框中添加第三列和第四列,并为基因组中出现在list_SSNP和list_SCPG中的位置添加值"1“。

我正在尝试获取如下所示的输出数据帧:

代码语言:javascript
运行
复制
Gene_Symbol       CHR        SNP     
A1BG             19q13.43             
PDE1C            12p13.31     1        

这是Genome内容的一部分,我提供了一个可重现的例子:

代码语言:javascript
运行
复制
Genome <- c()
Genome$Gene_Symbol <- c("A1BG", "A1BG-AS1", "A1CF", "A2M", "PDE1C")     
Genome$CHR <- c("19q13.43", "19q13.43", "10q11.23", "12p13.31", "12p13.31")
Gene_Symbol CHR
        1   A1BG        19q13.43
        2   A1BG-AS1    19q13.43
        3   A1CF        10q11.23
        4   A2M         12p13.31
        5   PDE1C       12p13.31

这是list_SSNP内容的一部分:

代码语言:javascript
运行
复制
list_SSNP <- c("PDE1C", "IMMP2L", "ZCCHC14", "NOS1AP", "HARBI1")
    Gene_Symbol
1   PDE1C
2   IMMP2L
3   ZCCHC14
4   NOS1AP
5   HARBI1

只使用一个数据帧( list_SSNP ),这是我首先尝试做的,我尝试做的是在基因组数据帧和我的基因组中的元素i(行)之间循环,如果我的list_SSNP数据帧的元素i类似于我的基因组数据帧中的元素i,然后将数字1添加到第三列,但是当我执行这段代码时,什么也没有发生。

代码语言:javascript
运行
复制
Full_genome <- read.table("FULL_GENOME.txt", header=TRUE, sep = "\t", dec = ',', na.strings=c("","NA"), fill=TRUE)
Genome <- Full_genome[,c(2,3)]
names(Genome) <- c("Gene_Symbol", "CHR")

list_SSNP <- as.data.frame(Gene_SSNP$Gene_Symbol)

for (i in 1: dim (Genome) [1]) {
  if(list_SSNP[i] %in% Genome[i,1]){
    Genome[i,3] <- 1 
  }
}

为了进一步澄清,我已经检查了list_SSNP中的所有元素都出现在基因组中,所以可以绝对确定这不是一个找不到任何重合的问题。

编辑:

我开始意识到,我的示例并没有指定list_SSNP和基因组中的条目是唯一的,没有重复的,基因组有大约30k行的条目,而list_SSNP有49行。我只想在Genome中添加一列,并在Genome和list_SSNP中存在条目的那些行中添加一个数字1。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-08 20:38:18

我相信这可能会有帮助。你可以试试这段代码:

代码语言:javascript
运行
复制
#Data
Genome <- data.frame(Gene_Symbol = c("A1BG", "A1BG-AS1", "A1CF", "A2M", "PDE1C"),
                     CHR = c("19q13.43", "19q13.43", "10q11.23", "12p13.31", "12p13.31"),
                     stringsAsFactors = F)
list_SSNP <- c("PDE1C", "IMMP2L", "ZCCHC14", "NOS1AP", "HARBI1")
#Collapse
vecc <- paste0(list_SSNP,collapse = '|')
#Contrast
Genome$SNP <- as.numeric(grepl(pattern = vecc,x = Genome$Gene_Symbol))

输出:

代码语言:javascript
运行
复制
  Gene_Symbol      CHR SNP
1        A1BG 19q13.43   0
2    A1BG-AS1 19q13.43   0
3        A1CF 10q11.23   0
4         A2M 12p13.31   0
5       PDE1C 12p13.31   1
票数 1
EN

Stack Overflow用户

发布于 2020-08-08 21:10:30

我在这里可能会遗漏一些重要的东西,但这个问题是针对它的领域而制定的。因此,当我放弃它时,我可能监督了我提出的解决方案中的一个问题。

但是,我知道list_SSNP可以多次使用SNP条目。因此,首先,您可以创建一个包含其出现次数的唯一SNP列表

代码语言:javascript
运行
复制
library(dplyr)

list_SSNP = data.frame(SNP = c("PDE1C", "IMMP2L", "ZCCHC14", "NOS1AP", "HARBI1"))
unique_SSNP = list_SSNP %>% 
    group_by(SNP) %>% 
    # the summarize() could be replaced by count I guess, but I usually use this for more control
    summarize(count = n()) 

现在你使用left_join

代码语言:javascript
运行
复制
Genome = data.frame(Gene_Symbol = c("A1BG", "A1BG-AS1", "A1CF", "A2M", "PDE1C"),
                     CHR = c("19q13.43", "19q13.43", "10q11.23", "12p13.31", "12p13.31"),
                     stringsAsFactors = F)

Genome_extended = Genome %>% 
    left_join(unique_SSNP, by = c("Gene_Symbol" = "SNP"))

对于不存在的SNP,扩展数据帧中的count列将是NAs,您可以使用dplyr、tidyr甚至base R中的各种命令填充NAs。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63314147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档