【问题标题】:How to include identifier column in aggregate result (R)如何在聚合结果中包含标识符列 (R)
【发布时间】:2018-06-08 23:33:55
【问题描述】:

我有一个数据框,想获取每个组的ABC 列的最小值。

df <- data.frame(ID = seq(1,9,1),
                group = c(1,1,1,2,2,2,3,3,3),
                A = runif(9, min=0, max=10),
                B = runif(9, min=-10, max=10),
                C = runif(9, min=0, max=100))

require(reshape2)
df_melt <- melt(data = df, id.vars = c("ID", "group"))


dat_min <- aggregate(x = df_melt[, 4], 
                     by = list(group = df_melt$group, variable = df_melt$variable), 
                     FUN = min, 
                     na.rm=TRUE)

我希望将ID 列附加到dat_min 数据框,以便生成的数据框为:

group   variable          x         ID
1        A          0.4934011       3
2        A          4.3482557       6
3        A          1.6423930       7
1        B          6.1969513       2
...     ...         ...             ...

这在aggregate 内可能吗?如何在分组/聚合过程中包含 ID 列而不实际使用它?

【问题讨论】:

  • 您应该在开头添加一个set.seed 调用,以便我们重现并了解您的预期输出
  • 如果 ID 对于组/变量对是唯一的,您可以安全地将其添加为 by 参数,如果不是,则不清楚要添加到每一行的 ID
  • 我想从属于特定最小值的列 ID 添加 ID。每行的 ID 都是唯一的。

标签: r aggregate


【解决方案1】:

我认为这可以解决问题,它依靠过滤而不是聚合来保留最小值:

library(dplyr)
library(tidyr)

df %>% 
  gather(var, val, A, B, C) %>%
  group_by(group, var) %>%
  arrange(group, val) %>%
  filter(row_number() == 1)

如果您相当有信心不会重复任何值,那么这可能会起作用:

df %>% 
  gather(var, val, A, B, C) %>%
  group_by(group, var) %>%
  summarize(min_val = min(val),
            id = max(ID * (val == min(val))))

如果有平局,则重新创建以获得多行:

set.seed(1)
df <- data.frame(ID = seq(1,9,1),
                 group = c(1,1,1,2,2,2,3,3,3),
                 A = sample(1:5, 9, replace = TRUE),
                 B = sample(1:5, 9, replace = TRUE),
                 C = sample(1:5, 9, replace = TRUE))

df %>% 
  gather(var, val, A, B, C) %>%
  group_by(group, var) %>%
  filter(val == max(val)) 

如果您希望所有行都具有最小值,请将 max(val) 更改为 min(val)

【讨论】:

  • 非常感谢。有用。如果您有重复的值,您将如何生成最大值?
  • 您只想要一个值吗?还是所有具有该值的行号?
  • 具有该值的所有行号。
  • 最后加了一点
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 2023-02-24
  • 2017-03-06
  • 2021-09-17
  • 1970-01-01
  • 2014-04-20
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多