gpt4 book ai didi

r - 给定列的最小值,在另一列中找到最小值(dplyr)

转载 作者:行者123 更新时间:2023-12-04 12:21:50 27 4
gpt4 key购买 nike

假设我们在 R 中有以下数据集:

> td
Type Rep Value1 Value2
1 A 1 7 1
2 A 2 5 4
3 A 3 5 3
4 A 4 8 2
5 B 1 5 10
6 B 2 6 1
7 B 3 7 1
8 C 1 8 13
9 C 2 8 13

> td <- structure(list(Type = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
3L, 3L), .Label = c("A", "B", "C"), class = "factor"), Rep = c(1L,
2L, 3L, 4L, 1L, 2L, 3L, 1L, 2L), Value1 = c(7L, 5L, 5L, 8L, 5L,
6L, 7L, 8L, 8L), Value2 = c(1L, 4L, 3L, 2L, 10L, 1L, 1L, 13L,
13L)), .Names = c("Type", "Rep", "Value1", "Value2"), class = "data.frame",
row.names = c(NA, -9L))

我想生成下表:

  Type MinValue1 MinValue2 MeanValue1 MeanValue2
1 A 5 3 6.25 2.5
2 B 5 10 6.00 4.0
3 C 3 13 8.00 13.0

在此表中,数据按“类型”汇总。列“MinValue1”是特定类型的最小值,列“MinValue2”是“Value2”的最小值,给定列“Value1”的最小值。列均值*是所有观察值的一般平均值。

实现此目的的一种方法是实现迭代每种类型并进行数学计算的循环。但是,我正在寻找一种更好/更简单/更漂亮的方法来执行此类操作。

我玩过“tidyverse”中的工具:

> library(tidyverse)
> td %>%
group_by(Type) %>%
summarise(MinValue1 = min(Value1),
MeanValue1 = mean(Value1),
MeanValue2 = mean(Value2))
# A tibble: 3 × 4
Type MinValue1 MeanValue1 MeanValue2
<fctr> <int> <dbl> <dbl>
1 A 5 6.25 2.5
2 B 5 6.00 4.0
3 C 8 8.00 13.0

请注意,我们这里没有列“MinValue2”。另请注意,“summarise(..., MinValue2 = min(Value2), ...)”不起作用,因为此解决方案采用一种类型的所有观察值中的最小值。

我们可以玩“切片”,然后合并结果:

> td %>% group_by(Type) %>% slice(which.min(Value1))
Source: local data frame [3 x 4]
Groups: Type [3]

Type Rep Value1 Value2
<fctr> <int> <int> <int>
1 A 3 5 4
2 B 1 5 10
3 C 1 8 13

但请注意,“切片”工具在这里对我们没有帮助:“类型 A,值 1 5”应该具有“值 2”== 3,而不是切片返回的 == 4。

那么,你们有没有优雅的方法来实现我想要的结果?谢谢!

最佳答案

一种方法是使用 order 函数的属性来断开与另一个向量的联系:

get_min_at_min <- function(vec1, vec2) {
return(vec2[order(vec1, vec2)[1]])
}

这将返回 vec2 的最小值,其中索引对应于 vec1 的最小值。使用此功能管道很简单:

td %>% 
group_by(Type) %>%
summarise(MinValue1 = min(Value1),
MinValue2 = get_min_at_min(Value1, Value2),
MeanValue1 = mean(Value1),
MeanValue2 = mean(Value2))

或者只是简单地利用这样一个事实,即可以在 dplyr 函数中处理计算变量:

td %>% 
group_by(Type) %>%
summarise(MinValue1 = min(Value1),
MinValue2 = min(Value2[Value1 == MinValue1]),
MeanValue1 = mean(Value1),
MeanValue2 = mean(Value2))

关于r - 给定列的最小值,在另一列中找到最小值(dplyr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41664449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com