在 R 中,当有多个列表需要匹配时,如何组合两个数据帧?

20220418更新

我将我的数据框更改为更像真实的数据框

“NA”和“-3”表示缺失值


> dfA
# A tibble: 6 × 5
  city  name  bloodtype pulse20 pulse21
  <chr> <chr> <chr>       <dbl>   <dbl>
1 CityA Angel A              78      79
2 CityA Bob   B              90      91
3 CityB Cathy A              60      64
4 CityB Dean  B              70      71
5 CityC Ellen O              60      -3
6 CityC Faye  AB             75      -3


> dfB
# A tibble: 3 × 4
  city  name  bloodtype pulse21
  <chr> <chr> <chr>       <dbl>
1 CityC Ellen O              65
2 CityC Faye  AB             79
3 CityC Gaven O              68

我使用 join 将它们组合成 df_joined


library(dplyr)
df_joined <- 
  dfA %>% 
  full_join(dfB, by = c("city", "name"), suffix = c("", "_repla"))
df_joined
#”repla”stands for “replacement”

   > df_joined
# A tibble: 7 × 7
  city  name  bloodtype pulse20 pulse21 bloodtype_repla pulse21_repla
  <chr> <chr> <chr>       <dbl>   <dbl> <chr>                   <dbl>
1 CityA Angel A              78      79 NA                         NA
2 CityA Bob   B              90      91 NA                         NA
3 CityB Cathy A              60      64 NA                         NA
4 CityB Dean  B              70      71 NA                         NA
5 CityC Ellen O              60      -3 O                          65
6 CityC Faye  AB             75      -3 AB                         79
7 CityC Gaven NA             NA      NA O                          68

我可以一个一个地改变它们,但是还有更多的“.repla”列,比如 100+

那么匹配相似的列名并对其进行变异的有效方法是什么,例如,将所有新数据从“formercolumnnames.repla”填充到“formercolumnnames”

我检查了 cross() 帮助文档,但仍然不太明白如何将其连接成清晰的方式。谢谢你的帮助^^

20220417以前的问题

我有2个数据框,

  1. dfA 是一个大数据,包括所有城市和 2020-2021 年的所有健康数据,但 2021 年 c 市的健康数据标记为“-3”。

自由度

  • 城市名称 Pulse20 Pulse21
  • CityA 艾米 77 78
  • CityB 鲍勃 80 79
  • CityC 凯茜 79 -3

  1. dfB 很小,包括我要填写的数据 dfA

东风

  • 城市名称 Pulse21
  • CityC 凯茜 80

请求: 1.如何将这两个dataframe组合成一个通用的使用方式?

2.如果我使用“full_join”,Pulse21会被列在“Pulse21.x”“Pulse21.y”中,所以我需要做更多的绑定工作

3.据记录,在我的真实数据中,每个城市有500多人,健康数据在100人以上。

  1. 那么我还有什么可以让它更简单高效的吗?非常感谢!
皮弗森

有几种方法可以做到这一点。

他们中的大多数依赖于您首先将您的-3值更改为NA值,例如通过mutate(across(where(is.numeric), ~ifelse(.x == -3, NA_real_, .x))).

下面是一些例子。

dplyr::rows_upsert

到目前为止,最简单的方法是使用dplyr::rows_upsert(). 这将使用非缺失数据更新您缺失的行,并插入您的第一个 df 中不存在的行。

library(dplyr)

dfA %>% 
  mutate(across(where(is.numeric), ~ifelse(.x == -3, NA_real_, .x))) %>% 
  dplyr::rows_upsert(dfB, by = c("city", "name"))
#> # A tibble: 7 × 5
#>   city  name  bloodtype pulse20 pulse21
#>   <chr> <chr> <chr>       <dbl>   <dbl>
#> 1 CityA Angel A              78      79
#> 2 CityA Bob   B              90      91
#> 3 CityB Cathy A              60      64
#> 4 CityB Dean  B              70      71
#> 5 CityC Ellen O              60      65
#> 6 CityC Faye  AB             75      79
#> 7 CityC Gaven O              NA      68

reprex 包(v2.0.1)于 2022-04-18 创建

请注意,此功能仍处于试验阶段,可能会随着 dplyr 的未来更新而改变。

full_join()pivot_longer()

如果我们首先连接具有不同后缀的两个数据框,我们可以tidyr::pivot_longer()为我们合并它们。这将首先创建一个长数据框,其中 和 之间的组合dfAdfBna.omit()确保我们只保留没有缺失值的值:

library(dplyr)

dfA %>% 
  full_join(dfB, by = c("city", "name"), suffix = c("_A", "_B")) %>% 
  mutate(across(where(is.numeric), ~ifelse(.x == -3, NA_real_, .x))) %>%
  tidyr::pivot_longer(
    ends_with(c("_A", "_B")), 
    names_to = ".value", 
    names_pattern = "(.*)_.*",
    values_drop_na = TRUE
  ) %>% 
  na.omit()
#> # A tibble: 6 × 5
#>   city  name  pulse20 bloodtype pulse21
#>   <chr> <chr>   <dbl> <chr>       <dbl>
#> 1 CityA Angel      78 A              79
#> 2 CityA Bob        90 B              91
#> 3 CityB Cathy      60 A              64
#> 4 CityB Dean       70 B              71
#> 5 CityC Ellen      60 O              65
#> 6 CityC Faye       75 AB             79

reprex 包(v2.0.1)于 2022-04-18 创建

请注意,此解决方案会删除仅存在于dfB.

bind_rows()summarise()

通过首先使用bind_rows(),我们可以按行组合两个 dfs。通过对 id 列进行分组,我们可以使用 eg 来汇总数据median(na.rm = TRUE),这将为我们删除缺失值:

library(dplyr)

dfA %>% 
  bind_rows(dfB) %>% 
  mutate(across(where(is.numeric), ~ifelse(.x == -3, NA_real_, .x))) %>% 
  group_by(city, name, bloodtype) %>% 
  summarise(
    across(
      everything(),
      ~median(.x, na.rm = TRUE)
    )
  ) %>% 
  ungroup()
#> `summarise()` has grouped output by 'city', 'name'. You can override using the
#> `.groups` argument.
#> # A tibble: 7 × 5
#>   city  name  bloodtype pulse20 pulse21
#>   <chr> <chr> <chr>       <dbl>   <dbl>
#> 1 CityA Angel A              78      79
#> 2 CityA Bob   B              90      91
#> 3 CityB Cathy A              60      64
#> 4 CityB Dean  B              70      71
#> 5 CityC Ellen O              60      65
#> 6 CityC Faye  AB             75      79
#> 7 CityC Gaven O              NA      68

reprex 包(v2.0.1)于 2022-04-18 创建

原始答案

与我原来的答案一样,您可以使用full_join()andmutate()来修复NAand-3问题。但是,当您有很多列时,这比上面提到的解决方案更困难。

数据

dfA <- tibble::tribble(
  ~city,  ~name,  ~bloodtype, ~pulse20, ~pulse21,
  "CityA", "Angel", "A",              78,      79,
  "CityA", "Bob",   "B",              90,      91,
  "CityB", "Cathy", "A",              60,      64,
  "CityB", "Dean",  "B",              70,      71,
  "CityC", "Ellen", "O",              60,      -3,
  "CityC", "Faye",  "AB",             75,      -3
)

dfB <- tibble::tribble(
  ~city,  ~name,  ~bloodtype, ~pulse21,
  "CityC", "Ellen", "O",              65,
  "CityC", "Faye",  "AB",             79,
  "CityC", "Gaven", "O",              68
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R中是否有一个函数可以组合从多个数据帧构建的图形的两个图例?

我的样本中有多少个簇?在 R 中组合两个数据帧

R中两个数据帧的匹配元素

匹配R中的两个数据帧

如何从两个数据帧中删除不匹配的数据,以在R中创建一个新的数据帧

如何使用具有多个条件的 dplyr 交叉检查 R 中的两个数据帧?

如何在 R 中匹配具有多个 ID 的多个数据帧

如何在R中绑定两个数据帧?

如何合并R中两个数据帧中只有一列相同的两个数据帧

如何在 R 中合并具有不同长度和两个条件的两个数据帧?

R:根据列中的值合并两个数据帧,并返回两个数据帧的所有值

在R中合并两个数据框时如何求和匹配列的值

匹配两个数据帧的行名,并且仅匹配R中的子集

在R中,如果两个数据帧具有匹配的公共ID,如何从一列追加类别变量?

组合 R 中的两个数据帧,无需重复输入

组合两个数据集以匹配每个 - R

如何为r中两个数据帧之间的匹配观测值分配相同的唯一ID?

R-两个数据帧列到键值对列表

使用R合并两个数据帧列表

用R中两个数据帧的匹配ID填充列

R中两个数据帧之间句子的最接近匹配

将两个数据帧与R中的某些字符匹配

通过R中的部分匹配来合并两个数据帧

用R中的重复键匹配两个数据帧

在一个数据帧中拆分所有列,并在R中创建两个数据帧

将两个不同列表的数据帧融为r中的一个数据帧列表

在 R 中,使用 for 循环比较两个数据帧的字符串变量以创建指示两个数据帧中匹配的新标志变量?

如何将两个数据帧中的行合并为 R 中的一个数据帧?

R:合并两个匹配数据帧列表