【问题标题】:R - Aggregate variables with min function and find index related to the min valueR - 使用 min 函数聚合变量并找到与最小值相关的索引
【发布时间】:2018-01-29 16:51:25
【问题描述】:

我有一个包含 3 列(ID、位置、值)的数据框。 每个 ID 有多个 PositionsValues。我想得到每个 ID 的最小值 Value,并且在同一个聚合中,得到最小值的位置。

例如:

Data <- data.frame(c("A","A","A","B","B"),c(10,2,4,1,6),c(0,5,4,3,1))

colnames(Data) <- c("ID","Position","Value")

# The result would be :
Data_min <- data.frame(c("A","B"),c(10,6),c(0,1)) 

# Aggregate function helps me getting the min value per ID : 
aggregate (Data$Value, list(Data$ID), min)

但我还没有找到如何获得与 min 相关的 Position。 我可以使用 which 函数和要查找的最小值,但我很确定有一种更聪明的方法可以做到这一点。

【问题讨论】:

  • 这个简单的例子能代表真正的问题吗?例如,您是否有可能建立联系? (即在多个位置找到的最小值)。您希望如何处理?

标签: r min


【解决方案1】:

考虑ave 子集数据帧并返回对应Value匹配的所有行:

Data[Data$Value == ave(Data$Value, Data$ID, FUN=min),]

#   ID Position Value
# 1  A       10     0
# 5  B        6     1

【讨论】:

  • 感谢您的回答。我不知道子集数据帧的 ave 表达式。过滤过程也可以正常工作。
  • 太棒了!不客气。 ave() 没有子集,而是跨子集运行聚合,但返回与输入相同的长度。我们只是将它包含在df[...,] 中以进行子集化。感谢您选择 base R,通常会输给其他数据整理包!
【解决方案2】:

@Antonis summarise 答案的另一种方法是将这个问题作为过滤过程来处理:

Data <- data.frame(c("A","A","A","B","B"),c(10,2,4,1,6),c(0,5,4,3,1))

colnames(Data) <- c("ID","Position","Value")

library(dplyr)

Data %>%
  group_by(ID) %>%
  filter(Value == min(Value)) %>%
  ungroup()

# # A tibble: 2 x 3
#   ID   Position Value
#   <fct>    <dbl> <dbl>
# 1 A        10.0   0   
# 2 B         6.00  1.00

【讨论】:

    【解决方案3】:

    这样的?

    df = Data %>% 
       group_by(ID) %>% 
       summarize(Position=Position[Value==min(Value)],
                 Value=min(Value))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2021-05-17
      • 2015-02-03
      • 2020-01-17
      • 2022-06-14
      • 2019-01-12
      • 2015-04-18
      相关资源
      最近更新 更多