R - 根据条件组合行以获得平均值/平均值

Posted

技术标签:

【中文标题】R - 根据条件组合行以获得平均值/平均值【英文标题】:R - Combine rows to get average/mean based on conditions 【发布时间】:2021-06-23 16:13:44 【问题描述】:

嘿,我有一个关于合并行以获得列的平均值的问题,基于 R 中列值的条件。

我想合并数据框中的 2 行,以根据其他列的条件获取列的平均值: 例如(参见下面的数据集示例)当列:depth == 20 & Species == "Diatoms" & locationID =="A",我想得到列数量的平均值,将此值添加到2 行中的 1 行并删除另一行。

 structure(list(depth = c(20, 20, 2, 4, 10), Species = c("Diatoms", 
"Diatoms", "Dinoflagellates", "Dinoflagellates", "Ciliates"), 
    locationID = c("A", "A", "B", "C", "A"), quantity = c(2, 
    4, 1, 2, 5)), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))```

【问题讨论】:

你能更新你的示例代码吗?您发布的代码不起作用,也不会生成数据框。 【参考方案1】:

由于看起来您的数据框设置为 tibble,我猜您正在使用 dplyr。在这种情况下,您应该能够使用group_by()summarize() 的组合来执行您想要执行的操作。您是在寻找每个物种、位置和配对的平均数量,还是只寻找一个?

使用 mtcars 数据集的示例:

library(dplyr)

mtcars %>%
      group_by(gear,  cyl,carb)%>%
      summarize(hp.mean = mean(hp))

# # A tibble: 12 x 4
# # Groups:   gear, cyl [8]
# gear   cyl  carb hp.mean
# <dbl> <dbl> <dbl>   <dbl>
# 1     3     4     1    97  
# 2     3     6     1   108. 
# 3     3     8     2   162. 
# 4     3     8     3   180  
# 5     3     8     4   228  
# 6     4     4     1    72.5
# 7     4     4     2    79.5
# 8     4     6     4   116. 

这种方法将所有行与匹配的 gear、cyl 和 carb 合并,并对所有匹配行的 hp 进行平均(在这种情况下)。

另一方面,如果您只想要一个案例的平均值,您可以子集或过滤然后取平均值。

mtcars %>%
      filter(
            gear == 3,
            cyl == 8, 
            carb == 3
      ) %>%
      pull(hp) %>%
      mean()
# [1] 180

# base approach to return single answer
mean(mtcars$hp[mtcars$gear == 3 &
               mtcars$cyl == 8 &
               mtcars$carb == 3
               ])
# [1] 180

【讨论】:

以上是关于R - 根据条件组合行以获得平均值/平均值的主要内容,如果未能解决你的问题,请参考以下文章

根据R中的条件计算日期之间的平均差

如何在 r 中绘制最小值、最大值和平均值

R中跨列的条件均值

基于分子中特定条件的平均值

R:提取具有NA的行,删除那些满足条件A并取那些满足条件B的平均值

在连接两个表时获得R中的加权平均值