当 A 列值匹配时,将 B 列 NAs 替换为 B 列值
When column A values match, replace column B NAs with column B value
我正在尝试根据两个变量(Entrez.ID 和 Gene.ID)合并两个数据帧。一个数据框只有那些变量,例如
Entrez.ID Gene.ID
10007 GNPDA1
10016 ALG2
10044 SH2D3C
和一个包含三个变量的数据框,例如
Entrez.ID Gene.ID Ensembl.ID
10007 GPI ENSG00000113552
10016 PDCD6 ENSG00000249915
10044 CHAT ENSG00000095370
目前当我合并文件时使用:
df<-merge(df1,df2,by=c("Entrez.ID","Gene.ID"),all=TRUE)
我得到一个如下所示的数据框:
Entrez.ID Gene.ID Ensembl.ID
10007 GNPDA1 <NA>
10007 GPI ENSG00000113552
10016 ALG2 <NA>
10016 PDCD6 ENSG00000249915
10044 SH2D3C <NA>
10044 CHAT ENSG00000095370
但我想要创建的是一个数据框,如下所示:
Entrez.ID Gene.ID Ensembl.ID
10007 GNPDA1 ENSG00000113552
10007 GPI ENSG00000113552
10016 ALG2 ENSG00000249915
10016 PDCD6 ENSG00000249915
10044 SH2D3C ENSG00000095370
10044 CHAT ENSG00000095370
我如何告诉 R Entrez.ID 变量匹配,我希望 Ensembl.ID 匹配(即在可用的情况下用 Ensembl.ID 替换 NA)?
我们可以使用 zoo
中的 na.locf
library(zoo)
df$Ensembl.ID <- with(df, ave(Ensembl.ID, Entrez.ID, FUN = function(x)
na.locf(na.locf(x, na.rm = FALSE), fromLast = TRUE)))
df$Ensembl.ID
#[1] "ENSG00000113552" "ENSG00000113552" "ENSG00000249915"
#[4] "ENSG00000249915" "ENSG00000095370"
#[6] "ENSG00000095370"
或使用 dplyr
中的 full_join
library(tidyverse)
full_join(df1, df2, by = c("Entrez.ID","Gene.ID")) %>%
group_by(Entrez.ID) %>%
fill(Ensembl.ID, .direction = 'up') %>%
fill(Ensembl.ID, .direction = 'down')
# A tibble: 6 x 3
# Groups: Entrez.ID [3]
# Entrez.ID Gene.ID Ensembl.ID
# <int> <chr> <chr>
#1 10007 GNPDA1 ENSG00000113552
#2 10007 GPI ENSG00000113552
#3 10016 ALG2 ENSG00000249915
#4 10016 PDCD6 ENSG00000249915
#5 10044 SH2D3C ENSG00000095370
#6 10044 CHAT ENSG00000095370
数据
df <- structure(list(Entrez.ID = c(10007L, 10007L, 10016L, 10016L,
10044L, 10044L), Gene.ID = c("GNPDA1", "GPI", "ALG2", "PDCD6",
"SH2D3C", "CHAT"), Ensembl.ID = c(NA, "ENSG00000113552", NA,
"ENSG00000249915", NA, "ENSG00000095370")), class = "data.frame",
row.names = c(NA, -6L))
如果 df1 的 Gene.ID 和 df2 的 Gene.ID 是唯一的(df1 中的 ID 不是 df2 中的 ID),您可以简单地合并
df <- merge(df1,df2,by=c("Entrez.ID"),all.x=TRUE)
然后使用 rbind()
df <- rbind(df, df2)
PS.I 会建议将来使用 data.table 进行数据整理。它非常直观且速度更快。
我正在尝试根据两个变量(Entrez.ID 和 Gene.ID)合并两个数据帧。一个数据框只有那些变量,例如
Entrez.ID Gene.ID
10007 GNPDA1
10016 ALG2
10044 SH2D3C
和一个包含三个变量的数据框,例如
Entrez.ID Gene.ID Ensembl.ID
10007 GPI ENSG00000113552
10016 PDCD6 ENSG00000249915
10044 CHAT ENSG00000095370
目前当我合并文件时使用:
df<-merge(df1,df2,by=c("Entrez.ID","Gene.ID"),all=TRUE)
我得到一个如下所示的数据框:
Entrez.ID Gene.ID Ensembl.ID
10007 GNPDA1 <NA>
10007 GPI ENSG00000113552
10016 ALG2 <NA>
10016 PDCD6 ENSG00000249915
10044 SH2D3C <NA>
10044 CHAT ENSG00000095370
但我想要创建的是一个数据框,如下所示:
Entrez.ID Gene.ID Ensembl.ID
10007 GNPDA1 ENSG00000113552
10007 GPI ENSG00000113552
10016 ALG2 ENSG00000249915
10016 PDCD6 ENSG00000249915
10044 SH2D3C ENSG00000095370
10044 CHAT ENSG00000095370
我如何告诉 R Entrez.ID 变量匹配,我希望 Ensembl.ID 匹配(即在可用的情况下用 Ensembl.ID 替换 NA)?
我们可以使用 zoo
na.locf
library(zoo)
df$Ensembl.ID <- with(df, ave(Ensembl.ID, Entrez.ID, FUN = function(x)
na.locf(na.locf(x, na.rm = FALSE), fromLast = TRUE)))
df$Ensembl.ID
#[1] "ENSG00000113552" "ENSG00000113552" "ENSG00000249915"
#[4] "ENSG00000249915" "ENSG00000095370"
#[6] "ENSG00000095370"
或使用 dplyr
full_join
library(tidyverse)
full_join(df1, df2, by = c("Entrez.ID","Gene.ID")) %>%
group_by(Entrez.ID) %>%
fill(Ensembl.ID, .direction = 'up') %>%
fill(Ensembl.ID, .direction = 'down')
# A tibble: 6 x 3
# Groups: Entrez.ID [3]
# Entrez.ID Gene.ID Ensembl.ID
# <int> <chr> <chr>
#1 10007 GNPDA1 ENSG00000113552
#2 10007 GPI ENSG00000113552
#3 10016 ALG2 ENSG00000249915
#4 10016 PDCD6 ENSG00000249915
#5 10044 SH2D3C ENSG00000095370
#6 10044 CHAT ENSG00000095370
数据
df <- structure(list(Entrez.ID = c(10007L, 10007L, 10016L, 10016L,
10044L, 10044L), Gene.ID = c("GNPDA1", "GPI", "ALG2", "PDCD6",
"SH2D3C", "CHAT"), Ensembl.ID = c(NA, "ENSG00000113552", NA,
"ENSG00000249915", NA, "ENSG00000095370")), class = "data.frame",
row.names = c(NA, -6L))
如果 df1 的 Gene.ID 和 df2 的 Gene.ID 是唯一的(df1 中的 ID 不是 df2 中的 ID),您可以简单地合并
df <- merge(df1,df2,by=c("Entrez.ID"),all.x=TRUE)
然后使用 rbind()
df <- rbind(df, df2)
PS.I 会建议将来使用 data.table 进行数据整理。它非常直观且速度更快。