如何合并 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 %&gt;% group_by(site, first(rep)) %&gt;% 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中的行名合并数据框

R语言dplyr包使用bind_rows函数纵向合并两个dataframe(行生长)使用bind_cols函数横向合并两个dataframe(列生长)

如何在R中的不同表中找到相等的行?

表格怎么把一样的内容合并

R删除冗余行数据基于dplyr包

R行数据过滤基于dplyr包filter函数