R语言 如果一个df中没有另一个df中的所有cols,则将它们相加并将all设置为

guz6ccqo  于 2023-04-27  发布在  其他
关注(0)|答案(4)|浏览(133)

我有2个 Dataframe ,例如:

# empty df
df1 <- data_frame(
  x = 1,
  y = 1,
  z = 1
) |> 
  filter(x < 1)

df2 <- data.frame(
  x = 1:10,
  a = 1:10,
  c = letters[1:10]
)

df 2不包含列y和z,但它们存在于df 1中。我想将df 2中不存在的列从df 1变异到df 2,这样我就有了一个看起来像这样的df:

df_full
    x  a c y z
1   1  1 a 0 0
2   2  2 b 0 0
3   3  3 c 0 0
4   4  4 d 0 0
5   5  5 e 0 0
6   6  6 f 0 0
7   7  7 g 0 0
8   8  8 h 0 0
9   9  9 i 0 0
10 10 10 j 0 0

如何使用r/dplyr添加df 1中不存在的任何列并将它们全部设置为0?

vd8tlhqk

vd8tlhqk1#

也许,使用bind_rows并替换为0

library(dplyr)
bind_rows(df2, df1) %>% 
   mutate(across(where(~ all(is.na(.x))), ~ 0))
  • 输出
x  a c y z
1   1  1 a 0 0
2   2  2 b 0 0
3   3  3 c 0 0
4   4  4 d 0 0
5   5  5 e 0 0
6   6  6 f 0 0
7   7  7 g 0 0
8   8  8 h 0 0
9   9  9 i 0 0
10 10 10 j 0 0

或在base R

df2[setdiff(names(df1), names(df2))] <- 0
jmo0nnb3

jmo0nnb32#

我们可以使用powerjoin库中的power_left_joinfill = 0

library(powerjoin)

power_left_join(df2, df1, fill = 0)

    x  a c y z
1   1  1 a 0 0
2   2  2 b 0 0
3   3  3 c 0 0
4   4  4 d 0 0
5   5  5 e 0 0
6   6  6 f 0 0
7   7  7 g 0 0
8   8  8 h 0 0
9   9  9 i 0 0
10 10 10 j 0 0
gupuwyp2

gupuwyp23#

带有merge的基本R选项

list2DF(
  lapply(
    merge(df1, df2, all = TRUE, sort = FALSE),
    \(x) replace(x, is.na(x), 0)
  )
)

给予

x y z  a c
1   1 0 0  1 a
2   2 0 0  2 b
3   3 0 0  3 c
4   4 0 0  4 d
5   5 0 0  5 e
6   6 0 0  6 f
7   7 0 0  7 g
8   8 0 0  8 h
9   9 0 0  9 i
10 10 0 0 10 j
mlnl4t2r

mlnl4t2r4#

你可以left_join你的 Dataframe 和replace_na到0 acrosscolumnnames的df 1与!!你需要这样:

library(dplyr)
library(tidyr)
df2 |>
  left_join(df1) |>
  mutate(across(!!colnames(df1), ~ replace_na(.x, 0)))
#> Joining with `by = join_by(x)`
#>     x  a c y z
#> 1   1  1 a 0 0
#> 2   2  2 b 0 0
#> 3   3  3 c 0 0
#> 4   4  4 d 0 0
#> 5   5  5 e 0 0
#> 6   6  6 f 0 0
#> 7   7  7 g 0 0
#> 8   8  8 h 0 0
#> 9   9  9 i 0 0
#> 10 10 10 j 0 0

创建于2023-04-26带有reprex v2.0.2

相关问题