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

Identify elements from df1 in df2, then add column in df2 in those rows that were coincident using R

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

我想做的是在我的基因组数据框中添加第三列和第四列,并为基因组中出现在 list_SSNP 和 [= 中的那些位置添加值“1” 34=].

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

Gene_Symbol       CHR        SNP     
A1BG             19q13.43             
PDE1C            12p13.31     1        

这是 Genome 内容的一部分,我已经包含了一个可重现的示例:

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的部分内容:

list_SSNP <- c("PDE1C", "IMMP2L", "ZCCHC14", "NOS1AP", "HARBI1")
    Gene_Symbol
1   PDE1C
2   IMMP2L
3   ZCCHC14
4   NOS1AP
5   HARBI1

仅使用 1 个数据帧 (list_SSNP),这是我首先尝试做的,我尝试做的是遍历基因组数据帧和元素 i (row) in我的基因组 如果我的 list_SSNP 数据框的元素 i 与我的基因组数据框中的元素 i 相似,则将数字 1 添加到第三列,但是当我执行此代码时,没有任何反应。

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 和 Genome 中的条目是唯一的并且没有重复项并且 Genome 有大约 30k 行条目,而 list_SSNP 有49. 我只想在 Genome 中添加一列,并在 Genome 和 list_SSNP.

中都存在条目的那些行中添加数字 1

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

#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))

输出:

  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

我可能在这里遗漏了一些重要的东西,但问题是针对其领域制定的。所以,当我抽象它时,我可能已经监督了我提出的解决方案的问题。

不过,据我所知,list_SSNP 可以有一个 SNP 条目多次。所以首先,您可以创建一个唯一 SNP 列表及其出现次数

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

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"))

扩展数据框中的计数列将是 non-existing 个 SNP 的 NA,您可以使用来自 dplyr、tidyr 甚至 base R 的各种命令填充 NA。