R 如何在列的一部分中找到最大值,然后将其所有值除以

R 如何在列的一部分中找到最大值,然后将其所有值除以,r,for-loop,search,dataframe,data-manipulation,R,For Loop,Search,Dataframe,Data Manipulation,我有一个df列,其中的值属于不同的池。每个池都有61条记录,之后第二个池开始。 我试图在每个池的61条记录中搜索最大值,然后将所有池的记录除以它,将结果存储到一个新列中,最后继续下面的下一个池 例如,对于第一个池,我可以使用以下代码 db$result <- db$value/max(db$value[1:61]) db$result <- db$value/max(db$value[62:123]) db$result可以使用zoo软件包中的rollapply提供一种解决方案 l

我有一个df列,其中的值属于不同的池。每个池都有61条记录,之后第二个池开始。 我试图在每个池的61条记录中搜索最大值,然后将所有池的记录除以它,将结果存储到一个新列中,最后继续下面的下一个池

例如,对于第一个池,我可以使用以下代码

db$result <- db$value/max(db$value[1:61])
db$result <- db$value/max(db$value[62:123])

db$result可以使用
zoo
软件包中的
rollapply
提供一种解决方案

library(zoo)
library(reshape2)
v1 <- rollapply(db$value, 61, by = 61, function(i) i/max(i))
db$result <- melt(t(v1))$value
图书馆(动物园)
图书馆(E2)

v1使用
rollapply
来自
zoo
软件包的一种解决方案可以

library(zoo)
library(reshape2)
v1 <- rollapply(db$value, 61, by = 61, function(i) i/max(i))
db$result <- melt(t(v1))$value
图书馆(动物园)
图书馆(E2)

v1我们可以使用
gl
创建一个分组变量,然后使用
ave
获得每个唯一组的
max
,将“值”除以该输出

db$result <- with(db, value/ave(value, as.numeric(gl(length(value), 61, 
                                length(value))),FUN = max))
数据
set.seed(24)

db我们可以使用
gl
创建一个分组变量,然后使用
ave
获得每个唯一组的
max
,将“值”除以该输出

db$result <- with(db, value/ave(value, as.numeric(gl(length(value), 61, 
                                length(value))),FUN = max))
数据
set.seed(24)

db我正在使用dplyr函数池添加我的解决方案,其中x是参数池中有多少个问题

 df<-data.frame(value=1:183,result=round(runif(183,min=10,max=90),0))

library(dplyr)
pool<-function(x){

    df$group<-ceiling(df$value/x)
    df<-df%>%group_by(group)%>%mutate(ratio=result/max(result,na.rm=TRUE))
    df
}

res<-pool(61)

df我正在用dplyr函数池添加我的解决方案,其中x是参数池中有多少个问题

 df<-data.frame(value=1:183,result=round(runif(183,min=10,max=90),0))

library(dplyr)
pool<-function(x){

    df$group<-ceiling(df$value/x)
    df<-df%>%group_by(group)%>%mutate(ratio=result/max(result,na.rm=TRUE))
    df
}

res<-pool(61)

df我做了一个使用max()、商和子集的解决方案。由于sapply不工作(不得不Lappy/unlist)和rep的应用程序,它最终变得相当丑陋,但为了完整性,我发布了它:

#creating test db with five intervals
db <- data.frame("codenum"=1:(61*5))
db$result <- sample(1:99, (61*5), replace = T)

#the actual function that solves the problem
db$maxval <- unlist(lapply(c(0:(length(db$result) %/% 61 - 1)), function(x) rep(max(db$result[(1+61*x):((61*(x+1)))]), 61)))

#explicit testing of the five intervals
max(db$result[1:61])
max(db$result[62:122])
max(db$result[123:183])
max(db$result[183:244])
max(db$result[245:305])
#创建具有五个间隔的测试数据库

db我做了一个使用max()、商和子集的解决方案。由于sapply不工作(不得不Lappy/unlist)和rep的应用程序,它最终变得相当丑陋,但为了完整性,我发布了它:

#creating test db with five intervals
db <- data.frame("codenum"=1:(61*5))
db$result <- sample(1:99, (61*5), replace = T)

#the actual function that solves the problem
db$maxval <- unlist(lapply(c(0:(length(db$result) %/% 61 - 1)), function(x) rep(max(db$result[(1+61*x):((61*(x+1)))]), 61)))

#explicit testing of the five intervals
max(db$result[1:61])
max(db$result[62:122])
max(db$result[123:183])
max(db$result[183:244])
max(db$result[245:305])
#创建具有五个间隔的测试数据库

DB请考虑提供一个可重复的例子。创建一个“池ID”变量来标识每个池,然后用一个分组函数如<代码> Au/<代码>从基础R、DPLYR、DATA表、…………运行您的分析。请考虑提供一个可重复的例子。创建一个“池ID”变量来标识每个池,然后用一个分组函数如<代码> Au/<代码>从基础R、DPLYR、DATA表、…………运行您的分析。等