如何合并 dplyr R 中两个不同列的行数据?
Posted
技术标签:
【中文标题】如何合并 dplyr R 中两个不同列的行数据?【英文标题】:How to merge row data for two different columns in dplyr R? 【发布时间】:2021-11-27 01:30:06 【问题描述】:site <- c(1,1,2,2,3,3,4,4)
rep <- c(1,2,1,2,1,2,1,2)
sp.1 <- c(NA,1,NA,4,NA,6,7,NA)
sp.2 <- c(2,NA,1,NA,5,6,7,8)
df.dummy <- data.frame(site, rep, sp.1, sp.2)
site rep sp.1 sp.2
1 1 1 NA 2
2 1 2 1 NA
3 2 1 NA 1
4 2 2 4 NA
5 3 1 NA 5
6 3 2 6 6
7 4 1 7 7
8 4 2 NA 8
在我的数据集中,我想做一些事情: 在相同的站点中,但不同的代表在一行中对 sp.1 具有 NA,在另一行中对 sp.2 具有 NA,反之亦然(例如,此数据框中的前两行),然后合并列。
所以行应该像
site rep sp.1 sp.2
1 1 1 1 2
2 1 2 1 NA ---> get rid of this row
3 2 1 4 1
4 2 2 4 NA ---> get rid of this row
5 3 1 NA 5
6 3 2 6 6
7 4 1 7 7
8 4 2 NA 8
例如,如果 sp.2 有两个相同站点和代表的数据点(例如 5 和 6),则取这两个点的平均值并按照 (1) 进行处理
最后,我只需要 4 行,但都用 sp.1 和 sp.2 填充
site rep sp.1 sp.2
1 1 1 2
2 1 4 1
3 2 6 5.5
4 1 7 7.5
编辑:我已经添加了结果
【问题讨论】:
请不要分享屏幕截图,而是数据的实际代码。另外:您的预期结果是什么,即您要保留/创建的实际 4 行的值? 输出应该是什么样的?我不确定我是否理解您在两个示例中的意思。剩下哪 4 行,它们显示什么? @deschen 谢谢!我已经添加了结果 @JonSpring 我已经添加了结果 @Biotechgeek 对于rep
行,选择哪个rep
是否有任何逻辑
【参考方案1】:
根据澄清进行编辑:
library(tidyverse)
df.dummy %>%
pivot_longer(sp.1:sp.2) %>%
group_by(site, name) %>%
summarize(value = mean(value, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = name, values_from = value)
或者更简单地说:
df.dummy %>%
group_by(site) %>%
summarize(across(sp.1:sp.2, ~mean(.x, na.rm = TRUE)))
# A tibble: 4 x 3
site sp.1 sp.2
<dbl> <dbl> <dbl>
1 1 1 2
2 2 4 1
3 3 6 5.5
4 4 7 7.5
【讨论】:
不完全。我已经修改了我的问题以澄清 @Jon Spring,友情提示:这可能并不重要,但如果我们使用跨解决方案,rep
列不会显示!我们可以使用:df.dummy %>% group_by(site, first(rep)) %>% summarize(across(sp.1:sp.2, ~mean(.x, na.rm = TRUE)))
【参考方案2】:
我们可能需要
library(dplyr)
df.dummy %>%
group_by(site) %>%
mutate(across(starts_with('sp'),
~.[order(is.na(.))])) %>%
filter(!if_all(starts_with('sp'), is.na)) %>%
summarise(rep= first(rep), across(starts_with('sp'),
mean, na.rm = TRUE))
-输出
# A tibble: 4 × 4
site rep sp.1 sp.2
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 2
2 2 1 4 1
3 3 1 6 5.5
4 4 1 7 7.5
【讨论】:
【参考方案3】:更新:
保留rep
列的较短版本:
df.dummy %>%
group_by(site, first(rep)) %>%
summarize(across(sp.1:sp.2, ~mean(.x, na.rm = TRUE)))
第一个答案:
我们可以这样做:按first(rep)
分组:
library(dplyr)
df.dummy %>%
group_by(site, first(rep)) %>%
summarise(sp.1=mean(sp.1, na.rm = TRUE), sp.2=mean(sp.2, na.rm = TRUE))
# Groups: site [4]
site `first(rep)` sp.1 sp.2
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 2
2 2 1 4 1
3 3 1 6 5.5
4 4 1 7 7.5
【讨论】:
略短:... summarize(across(sp.1:sp.2, ~mean(.x, na.rm = TRUE)))
以上是关于如何合并 dplyr R 中两个不同列的行数据?的主要内容,如果未能解决你的问题,请参考以下文章
R语言dplyr包使用bind_rows函数纵向合并两个dataframe(行生长)使用bind_cols函数横向合并两个dataframe(列生长)