我想合并兩個資料框。有一些共享變數和一些不同的變數,每個資料幀中有不同的行數。資料框共享一些行,但不是全部。并且兩個資料框都缺少另一個我擁有的資料。
DF1:
| 姓名 | 年齡 | 重量 | 高度 |
|---|---|---|---|
| 蒂姆 | 7 | 54 | 112 |
| 戴夫 | 5 | 50 | 不適用 |
| 拉里 | 不適用 | 42 | 73 |
| 搶 | 1 | 30 | 43 |
DF2:
| 姓名 | 年齡 | 重量 | 高度 | 年級 |
|---|---|---|---|---|
| 蒂姆 | 7 | 不適用 | 112 | 2 |
| 戴夫 | 不適用 | 50 | 103 | 1 |
| 拉里 | 3 | 不適用 | 73 | 不適用 |
| 搶 | 1 | 30 | 不適用 | 不適用 |
| 約翰 | 6 | 60 | 不適用 | 1 |
| 湯姆 | 8 | 61 | 112 | 2 |
我想通過共享列(姓名、年齡、體重和身高)將這兩個資料框合并在一起。但是,我希望覆寫 NA,這樣如果兩個資料幀中的一個具有另一個具有 NA 的值,我希望將該值傳遞到第三個資料幀中。理想情況下,只有當 DF1 和 DF2 在同一位置都有 NA 時,最后一個資料幀才應該有 NA。
理想資料框
| 姓名 | 年齡 | 重量 | 高度 | 年級 |
|---|---|---|---|---|
| 蒂姆 | 7 | 54 | 112 | 2 |
| 戴夫 | 5 | 50 | 103 | 1 |
| 拉里 | 3 | 42 | 73 | 不適用 |
| 搶 | 1 | 30 | 43 | 不適用 |
| 約翰 | 6 | 60 | 不適用 | 1 |
| 湯姆 | 8 | 61 | 112 | 2 |
我一直在使用 full_join 和 left_join,但我不知道如何合并它們,以便將 NA 替換為實際資料(如果它存在于其中一個資料幀中)。有沒有辦法做到這一點?
uj5u.com熱心網友回復:
這是一個可以治療的典型rows_patch()案例dplyr。
library(dplyr)
rows_patch(df2, df1, by = "name")
name age weight height grade
1 Tim 7 54 112 2
2 Dave 5 50 103 1
3 Larry 3 42 73 NA
4 Rob 1 30 43 NA
5 John 6 60 NA 1
6 Tom 8 61 112 2
資料
df1 <- structure(list(name = c("Tim", "Dave", "Larry", "Rob"), age = c(7L,
5L, NA, 1L), weight = c(54L, 50L, 42L, 30L), height = c(112L,
NA, 73L, 43L)), class = "data.frame", row.names = c(NA, -4L))
df2 <- structure(list(name = c("Tim", "Dave", "Larry", "Rob", "John",
"Tom"), age = c(7L, NA, 3L, 1L, 6L, 8L), weight = c(NA, 50L,
NA, 30L, 60L, 61L), height = c(112L, 103L, 73L, NA, NA, 112L),
grade = c(2L, 1L, NA, NA, 1L, 2L)), class = "data.frame", row.names = c(NA, -6L))
uj5u.com熱心網友回復:
我喜歡powerjoin作為對第一條評論中問題的回答而建議的包裹,這是我以前從未聽說過的。
但是,如果您想避免使用額外的包,您可以在 base R 中執行此操作。這種方法還避免了必須顯式命名每一列 -dplyr注釋中建議的方法不會這樣做,盡管可能可以修改。
# Load data
df1 <- read.table(text = "name age weight height
Tim 7 54 112
Dave 5 50 NA
Larry NA 42 73
Rob 1 30 43", header=TRUE)
df2 <- read.table(text = "name age weight height grade
Tim 7 NA 112 2
Dave NA 50 103 1
Larry 3 NA 73 NA
Rob 1 30 NA NA
John 6 60 NA 1
Tom 8 61 112 2", header=TRUE)
df3 <- merge(df1, df2, by = "name", all = TRUE, sort=FALSE)
# Coalesce the common columns
common_cols <- names(df1)[names(df1)!="name"]
df3[common_cols] <- lapply(common_cols, function(col) {
coalesce(df3[[paste0(col, ".x")]], df3[[paste0(col, ".y")]])
})
# Select desired columns
df3[names(df2)]
# name age weight height grade
# 1 Tim 7 54 112 2
# 2 Dave 5 50 103 1
# 3 Larry 3 42 73 NA
# 4 Rob 1 30 43 NA
# 5 John 6 60 NA 1
# 6 Tom 8 61 112 2
使用 base R 有很多優點,但 powerjoin 看起來也是一個有趣的包。
uj5u.com熱心網友回復:
另一種可能的解決方案:
library(tidyverse)
df2 %>%
bind_rows(df1) %>%
group_by(name) %>%
fill(age:grade, .direction = "updown") %>%
ungroup %>%
distinct
#> # A tibble: 6 x 5
#> name age weight height grade
#> <chr> <int> <int> <int> <int>
#> 1 Tim 7 54 112 2
#> 2 Dave 5 50 103 1
#> 3 Larry 3 42 73 NA
#> 4 Rob 1 30 43 NA
#> 5 John 6 60 NA 1
#> 6 Tom 8 61 112 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466690.html
上一篇:無法在熊貓中操作資料框
下一篇:如何在熊貓中將多組列轉換為單列?
