首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多个类别的最大R

多个类别的最大R
EN

Stack Overflow用户
提问于 2018-01-28 13:43:31
回答 3查看 276关注 0票数 3

我得到的数据有点像这样(当然还有更多的行):

代码语言:javascript
运行
复制
Age     Work Zone     SomeNumber
26      1          2.61
32      4          8.42
41      2          9.71
45      2          4.14
64      3          6.04
56      1          5.28
37      4          7.93

我想要获取每个区域在每个年龄或以下的最大SomeNumber。SomeNumber随着年龄的增长而增加,所以我预计32岁以下的人在二区的SomeNumber最高是31岁的人,但实际上也可能是27岁的人。

为此,我编写了一个嵌套的for循环:

代码语言:javascript
运行
复制
for(i in zonelist){
  temp = data[data$zone==i,]
  for(j in 1:max(data$age)){
    temp.lessequal=c(temp.lessequal,max((temp[temp$Age<=j,])$SomeNumber))
  }
  #plot temp.lessequal or save it at this point
}

这当然是非常慢的。我怎样才能更快地做到这一点?我已经查看了一次按两列排序的order函数,但这不允许我取每组的最大值。

EN

回答 3

Stack Overflow用户

发布于 2018-01-28 13:58:12

数据:

代码语言:javascript
运行
复制
df1 <- read.table(text='Age Work_Zone  SomeNumber
26      1          2.61
                   32      4          8.42
                   41      2          9.71
                   45      2          4.14
                   64      3          6.04
                   56      1          5.28
                   37      4          7.93', 
                   header = TRUE)

代码:

代码语言:javascript
运行
复制
df2 <- with( df1, df1[ Age <= 32, ] )  # extract rows with Age <= 32
# get maximum of someNumber by aggregating with work_zone and then merging with df1 to combine the age column
merge(aggregate(SomeNumber ~ Work_Zone, data = df2, max), df2) 
#   Work_Zone SomeNumber Age
# 1         1       2.61  26
# 2         4       8.42  32
票数 1
EN

Stack Overflow用户

发布于 2018-01-28 14:13:40

使用库data.table,您可以选择小于所需年龄的行,然后输出每个工作区的max(somenumber)和它们各自的年龄。

代码语言:javascript
运行
复制
library(data.table)
setDT(df1)[Age<=32,.(max(SomeNumber),Age),by=Work_Zone]
   Work_Zone   V1 Age
1:         1 2.61  26
2:         4 8.42  32
票数 0
EN

Stack Overflow用户

发布于 2018-01-28 16:48:42

OP似乎正在根据特定列(Age)上的<=条件来查找max值。

在这种情况下,为了解释逻辑,sqldf的使用变得非常方便。一种解决方案可能是:

代码语言:javascript
运行
复制
# Data 
df <- read.table(text = "Age     Work_Zone     SomeNumber
26      1          2.61
32      4          8.42
41      2          9.71
45      2          4.14
64      3          6.04
56      1          5.28
37      4          7.93", header = T, stringsAsFactors = F)

library(sqldf)
df3 <- sqldf("select df1.Work_Zone, df1.Age, max(df2.SomeNumber) from df df1 
       inner join df df2 on df1.Work_Zone = df2.Work_Zone 
       WHERE df2.Age <= df1.Age 
       GROUP BY df1.Work_Zone, df1.Age")

# Result:
#   Work_Zone Age max(df2.SomeNumber)
# 1         1  26                2.61
# 2         1  56                5.28
# 3         2  41                9.71
# 4         2  45                9.71
# 5         3  64                6.04
# 6         4  32                8.42
# 7         4  37                8.42
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48483537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档