【问题标题】:aggregate values across a row dplyr跨行聚合值 dplyr
【发布时间】:2017-08-10 19:56:23
【问题描述】:

对于像下面这样的数据框,需要对每一行的列进行聚合(平均)。

> df <- data.frame(
  id = c(1,2), 
  loc=c("loc1", "loc2"), 
  val1=c(10,20), val2=c(190,NA), val3=c(NA, 10)
)
> df
  id  loc val1  val2  val3
1  1 loc1   10   190    NA
2  2 loc2   20   NA     10

按列进行常规聚合可以完成

df %>%
 group_by(id, loc) %>%
 summarise(mean_val1 = mean(val1))

如何按行计算 val1, val2, val3 的平均值?所需的输出如下。

  id  loc vals_mean
1  1 loc1   100
2  2 loc2   15  

【问题讨论】:

  • @T-Heron 此处包含一个示例 - 您的评论指的是mcve 的哪一部分?
  • 好的,请忽略。
  • @T-Heron 以防万一你投了反对票?
  • 这不是我写的。我总是立即纠正我的投票错误。

标签: r dplyr


【解决方案1】:

您的数据不整齐。先整理一下,使用gather:

library(tidyverse)

df %>% 
  gather(key = "key", value = "value", val1, val2, val3) %>% 
  group_by(id, loc) %>% 
  summarize(mean = mean(value, na.rm = T))

#     id    loc  mean
#  <dbl> <fctr> <dbl>
#1     1   loc1   100
#2     2   loc2    15

如果你想让你的数据框保持不整洁的格式,rowwise 是你的朋友:

df %>% 
  rowwise() %>% 
  mutate(mean = mean(c(val1, val2, val3), na.rm = TRUE))

## A tibble: 2 × 6
#     id    loc  val1  val2  val3  Mean
#  <dbl> <fctr> <dbl> <dbl> <dbl> <dbl>
#1     1   loc1    10   190    NA   100
#2     2   loc2    20    NA    10    15

【讨论】:

  • 你为什么用tidyverse而不是tidyr
  • 比打电话更容易library(tidyr); library(dplyr)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多