首页 > 解决方案 > 在 R 中使用嵌套循环计算一系列唯一 ID 和天数的最小值和最大值

问题描述

我正在尝试循环并返回一系列唯一 ID 在几天内的最小值和最大值计算。我尝试遍历天数,然后遍历天数的每个唯一值,但它并没有完全按照我的意愿去做,我得到了一个“4 列表”,其中包含 ID 的所有迭代,但其他所有的迭代都是 NA。

days<-c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
id<-c(1.1,1.1,1.2,1.2,1.1,1.2,1.2,1.1,1.2,1.2,1.2,1.1,1.1,1.1,1.1)
a<-c(1,3,1,5,1,5,2,3,1,5,2,1,4,5,3)

df=data.frame(days,id,a)

newdf<-NULL
daylist<-unique(df$days)
idlist<-unique(df$id)

for (d in daylist) {
  for (i in idlist) {

    minvalue<-min(df$a)
    maxvalue<-max(df$a)
    newdf$minValue[i]<-minvalue
    newdf$maxValue[i]<-maxvalue
    newdf$day<-d
    newdf$ID<-i

  }
}

我希望输出数据帧的每一行都包含每天的 ID、日期、最大值和最小值。

谢谢!

标签: rloops

解决方案


您可以使用dplyrgroup_by。R 中的 for 循环非常慢。

> library("dplyr")
> df %>% group_by(days, id) %>% summarise(minvalue = min(a), maxvalue = max(a))

   days    id minvalue maxvalue
  <dbl> <dbl>    <dbl>    <dbl>
1  1.00  1.10     1.00     3.00
2  1.00  1.20     1.00     1.00
3  2.00  1.10     1.00     1.00
4  2.00  1.20     5.00     5.00
5  3.00  1.10     3.00     3.00
6  3.00  1.20     1.00     2.00
7  4.00  1.10     1.00     1.00
8  4.00  1.20     2.00     5.00
9  5.00  1.10     3.00     5.00

推荐阅读