合并两个 data.frames(单元格方式)
Merge two data.frames (cell wise)
我有 2 个 data.frames(df1 和 df2),其中有一些空单元格 (NA)。
df1<-data.frame(code=c("A","B","C","D"),
x=c(2.3,NA,3.1,2.6),
y=c(4.1,2,NA,8))
df2<-data.frame(code=c("A","B","C","D"),
x=c(NA,8.1,NA,NA),
y=c(NA,NA,0.5,NA))
我想用 df2 中的相应值填充 df1 中的 NA 单元格。
预期结果:
code x y
1 A 2.3 4.1
2 B 8.1 2.0
3 C 3.1 0.5
4 D 2.6 8.0
我设法用 for 循环完成了(扫描每个单元格)。
它有效,但我想有更有效的方法...我喜欢学习新技巧...
提前致谢
一个可能的解决方案,使用purrr::map2_dfc
:
library(tidyverse)
map2_dfc(df1, df2, ~ if_else(is.na(.x), .y, .x))
#> # A tibble: 4 × 3
#> code x y
#> <chr> <dbl> <dbl>
#> 1 A 2.3 4.1
#> 2 B 8.1 2
#> 3 C 3.1 0.5
#> 4 D 2.6 8
使用coalesce
:
library(dplyr)
do.call(coalesce, list(df1, df2))
code x y
1 A 2.3 4.1
2 B 8.1 2.0
3 C 3.1 0.5
4 D 2.6 8.0
为了速度
# set as data.table
lapply(list(df1, df2), \(i) setDT(i))
# custom efficient coalesce
coalesce2 <- function(...)
{
Reduce(function(x, y) {
i <- which(is.na(x))
x[i] <- y[i]
x},
list(...))
}
# join
df3 <- df2[df1, on =.(code)]
# apply coalesce
df3[, `:=` (x = coalesce2(i.x, x)
, y = coalesce2(i.y, y)
)
][, c('i.x', 'i.y') := NULL
]
基本 R 选项
df1[is.na(df1)] = as.numeric(df2[is.na(df1)])
df1
我有 2 个 data.frames(df1 和 df2),其中有一些空单元格 (NA)。
df1<-data.frame(code=c("A","B","C","D"),
x=c(2.3,NA,3.1,2.6),
y=c(4.1,2,NA,8))
df2<-data.frame(code=c("A","B","C","D"),
x=c(NA,8.1,NA,NA),
y=c(NA,NA,0.5,NA))
我想用 df2 中的相应值填充 df1 中的 NA 单元格。
预期结果:
code x y
1 A 2.3 4.1
2 B 8.1 2.0
3 C 3.1 0.5
4 D 2.6 8.0
我设法用 for 循环完成了(扫描每个单元格)。
它有效,但我想有更有效的方法...我喜欢学习新技巧...
提前致谢
一个可能的解决方案,使用purrr::map2_dfc
:
library(tidyverse)
map2_dfc(df1, df2, ~ if_else(is.na(.x), .y, .x))
#> # A tibble: 4 × 3
#> code x y
#> <chr> <dbl> <dbl>
#> 1 A 2.3 4.1
#> 2 B 8.1 2
#> 3 C 3.1 0.5
#> 4 D 2.6 8
使用coalesce
:
library(dplyr)
do.call(coalesce, list(df1, df2))
code x y
1 A 2.3 4.1
2 B 8.1 2.0
3 C 3.1 0.5
4 D 2.6 8.0
为了速度
# set as data.table
lapply(list(df1, df2), \(i) setDT(i))
# custom efficient coalesce
coalesce2 <- function(...)
{
Reduce(function(x, y) {
i <- which(is.na(x))
x[i] <- y[i]
x},
list(...))
}
# join
df3 <- df2[df1, on =.(code)]
# apply coalesce
df3[, `:=` (x = coalesce2(i.x, x)
, y = coalesce2(i.y, y)
)
][, c('i.x', 'i.y') := NULL
]
基本 R 选项
df1[is.na(df1)] = as.numeric(df2[is.na(df1)])
df1