根据行和列,使用来自另一个 table 的值填充 table
Populate table with values from another table based on both rows and columns
我有一个看起来像这样的空数据框:
df <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
"NRAS"),
A183=c(NA, NA, NA, NA, NA),
A240=c(NA, NA, NA, NA, NA),
A330=c(NA, NA, NA, NA, NA))
我想使用更大的数据框来填充前一个数据框。大数据框的结构如下:
df2 <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
"NRAS", "TP53", "EGFR"),
A183=c(2.3, 3.3, 2.6, 4.7, 1.2, 5.7, 3.4),
A240=c(1.3, 2.3, 4.6, 5.7, 2.2, 7.7, 1.4),
A330=c(0.3, 2.3, 1.6, 1.7, 4.2, 1.7, 4.4),
A335=c(1.3, 0.3, 0.6, 0.7, 0.2, 0.7, 0.4),
A345=c(0.3, 4.3, 4.6, 4.7, 4.2, 4.7, 0.4))
我想要的输出应该是这样的:
Hugo_Symbol A183 A240 A330
1 CDKN2A 2.3 1.3 0.3
2 JUN 3.3 2.3 2.3
3 IRS2 2.6 4.6 1.6
4 MTOR 4.7 5.7 1.7
5 NRAS 1.2 2.2 4.2
我尝试使用 dplyr
包,特别是 semi_join()
功能,但它 returns 对我来说是空的 table。
我们可以使用连接
library(data.table)
nm1 <- names(df)[-1]
df[nm1] <- lapply(df[nm1], as.numeric)
setDT(df)[df2, (nm1) := mget(paste0('i.', nm1)), on = .(Hugo_Symbol)]
-输出
df
Hugo_Symbol A183 A240 A330
1: CDKN2A 2.3 1.3 0.3
2: JUN 3.3 2.3 2.3
3: IRS2 2.6 4.6 1.6
4: MTOR 4.7 5.7 1.7
5: NRAS 1.2 2.2 4.2
是否可以只从第一个数据框中删除 NA 列?如果是这样,左连接将产生所需的输出。
df <- data.frame(
Hugo_Symbol = c("CDKN2A", "JUN", "IRS2", "MTOR",
"NRAS"),
A183 = c(NA, NA, NA, NA, NA),
A240 = c(NA, NA, NA, NA, NA),
A330 = c(NA, NA, NA, NA, NA)
)
df2 <- data.frame(
Hugo_Symbol = c("CDKN2A", "JUN", "IRS2", "MTOR",
"NRAS", "TP53", "EGFR"),
A183 = c(2.3, 3.3, 2.6, 4.7, 1.2, 5.7, 3.4),
A240 = c(1.3, 2.3, 4.6, 5.7, 2.2, 7.7, 1.4),
A330 = c(0.3, 2.3, 1.6, 1.7, 4.2, 1.7, 4.4),
A335 = c(1.3, 0.3, 0.6, 0.7, 0.2, 0.7, 0.4),
A345 = c(0.3, 4.3, 4.6, 4.7, 4.2, 4.7, 0.4)
)
library(dplyr)
left_join(df["Hugo_Symbol"], df2, by = "Hugo_Symbol")
您也可以使用以下解决方案:
library(dplyr)
df %>%
left_join(df2, by = "Hugo_Symbol") %>%
mutate(across(ends_with(".x"), ~ coalesce(.x, get(gsub(".x", ".y", cur_column()))))) %>%
select(Hugo_Symbol, ends_with(".x")) %>%
rename_with(~ gsub(".x", "", .), ends_with(".x"))
Hugo_Symbol A183 A240 A330
1 CDKN2A 2.3 1.3 0.3
2 JUN 3.3 2.3 2.3
3 IRS2 2.6 4.6 1.6
4 MTOR 4.7 5.7 1.7
5 NRAS 1.2 2.2 4.2
另一种方法-
left_join
在 hugo_symbol
- 然后仅在那些以后缀
.y
和 hugo_symbol
结尾的列上使用 transmute
across
- 保留原样的值。因此
~.
- 使用
.names
参数从名称中删除 .y
。使用正则表达式 [.]y
这样就不会被解释为通配符和 y.
library(dplyr)
df %>% left_join(df2, by = 'Hugo_Symbol') %>%
transmute(across(Hugo_Symbol | ends_with('.y'), ~., .names = '{gsub("[.]y", "", .col )}'))
#> Hugo_Symbol A183 A240 A330
#> 1 CDKN2A 2.3 1.3 0.3
#> 2 JUN 3.3 2.3 2.3
#> 3 IRS2 2.6 4.6 1.6
#> 4 MTOR 4.7 5.7 1.7
#> 5 NRAS 1.2 2.2 4.2
由 reprex package (v2.0.0)
于 2021-07-24 创建
我有一个看起来像这样的空数据框:
df <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
"NRAS"),
A183=c(NA, NA, NA, NA, NA),
A240=c(NA, NA, NA, NA, NA),
A330=c(NA, NA, NA, NA, NA))
我想使用更大的数据框来填充前一个数据框。大数据框的结构如下:
df2 <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
"NRAS", "TP53", "EGFR"),
A183=c(2.3, 3.3, 2.6, 4.7, 1.2, 5.7, 3.4),
A240=c(1.3, 2.3, 4.6, 5.7, 2.2, 7.7, 1.4),
A330=c(0.3, 2.3, 1.6, 1.7, 4.2, 1.7, 4.4),
A335=c(1.3, 0.3, 0.6, 0.7, 0.2, 0.7, 0.4),
A345=c(0.3, 4.3, 4.6, 4.7, 4.2, 4.7, 0.4))
我想要的输出应该是这样的:
Hugo_Symbol A183 A240 A330
1 CDKN2A 2.3 1.3 0.3
2 JUN 3.3 2.3 2.3
3 IRS2 2.6 4.6 1.6
4 MTOR 4.7 5.7 1.7
5 NRAS 1.2 2.2 4.2
我尝试使用 dplyr
包,特别是 semi_join()
功能,但它 returns 对我来说是空的 table。
我们可以使用连接
library(data.table)
nm1 <- names(df)[-1]
df[nm1] <- lapply(df[nm1], as.numeric)
setDT(df)[df2, (nm1) := mget(paste0('i.', nm1)), on = .(Hugo_Symbol)]
-输出
df
Hugo_Symbol A183 A240 A330
1: CDKN2A 2.3 1.3 0.3
2: JUN 3.3 2.3 2.3
3: IRS2 2.6 4.6 1.6
4: MTOR 4.7 5.7 1.7
5: NRAS 1.2 2.2 4.2
是否可以只从第一个数据框中删除 NA 列?如果是这样,左连接将产生所需的输出。
df <- data.frame(
Hugo_Symbol = c("CDKN2A", "JUN", "IRS2", "MTOR",
"NRAS"),
A183 = c(NA, NA, NA, NA, NA),
A240 = c(NA, NA, NA, NA, NA),
A330 = c(NA, NA, NA, NA, NA)
)
df2 <- data.frame(
Hugo_Symbol = c("CDKN2A", "JUN", "IRS2", "MTOR",
"NRAS", "TP53", "EGFR"),
A183 = c(2.3, 3.3, 2.6, 4.7, 1.2, 5.7, 3.4),
A240 = c(1.3, 2.3, 4.6, 5.7, 2.2, 7.7, 1.4),
A330 = c(0.3, 2.3, 1.6, 1.7, 4.2, 1.7, 4.4),
A335 = c(1.3, 0.3, 0.6, 0.7, 0.2, 0.7, 0.4),
A345 = c(0.3, 4.3, 4.6, 4.7, 4.2, 4.7, 0.4)
)
library(dplyr)
left_join(df["Hugo_Symbol"], df2, by = "Hugo_Symbol")
您也可以使用以下解决方案:
library(dplyr)
df %>%
left_join(df2, by = "Hugo_Symbol") %>%
mutate(across(ends_with(".x"), ~ coalesce(.x, get(gsub(".x", ".y", cur_column()))))) %>%
select(Hugo_Symbol, ends_with(".x")) %>%
rename_with(~ gsub(".x", "", .), ends_with(".x"))
Hugo_Symbol A183 A240 A330
1 CDKN2A 2.3 1.3 0.3
2 JUN 3.3 2.3 2.3
3 IRS2 2.6 4.6 1.6
4 MTOR 4.7 5.7 1.7
5 NRAS 1.2 2.2 4.2
另一种方法-
left_join
在hugo_symbol
- 然后仅在那些以后缀
.y
和hugo_symbol
结尾的列上使用 - 保留原样的值。因此
~.
- 使用
.names
参数从名称中删除.y
。使用正则表达式[.]y
这样就不会被解释为通配符和 y.
transmute
across
library(dplyr)
df %>% left_join(df2, by = 'Hugo_Symbol') %>%
transmute(across(Hugo_Symbol | ends_with('.y'), ~., .names = '{gsub("[.]y", "", .col )}'))
#> Hugo_Symbol A183 A240 A330
#> 1 CDKN2A 2.3 1.3 0.3
#> 2 JUN 3.3 2.3 2.3
#> 3 IRS2 2.6 4.6 1.6
#> 4 MTOR 4.7 5.7 1.7
#> 5 NRAS 1.2 2.2 4.2
由 reprex package (v2.0.0)
于 2021-07-24 创建