在 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。
我有一个包含两列的数据框(基因组)和一个包含一列的数据框(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。