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.如何将这两个dataframe组合成一个通用的使用方式?
2.如果我使用“full_join”,Pulse21会被列在“Pulse21.x”“Pulse21.y”中,所以我需要做更多的绑定工作
3.据记录,在我的真实数据中,每个城市有500多人,健康数据在100人以上。
有几种方法可以做到这一点。
他们中的大多数依赖于您首先将您的-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()
为我们合并它们。这将首先创建一个长数据框,其中 和 之间的组合dfA
,dfB
但na.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()
来修复NA
and-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] 删除。
我来说两句