根据 R 中的子类别对数据进行排名
Ranking data based on subcategories in R
我有一个包含 48,000 个观测值和 9 个变量的数据集。我正在尝试通过变量 nphase1、meanshift 和 sigmashift 来计算变量 arl_method1 的排名。 nphase1、均值、s-shift 的每个组合都有 1000 个观测值。我试图让 R 从 1 到 1000 对这些进行排名,但我看不到代码是否正确,而是根据整个数据集计算排名,因此它产生的排名高达 48k。
我的代码:
mydata<-read.table("C:\Users\Adam\Desktop\R\study2_total.csv", header=TRUE, sep=",")
mydata2<-data.frame(mydata, D1=abs(mydata$ARL_method1-desiredrun), D2=abs(mydata$ARL_method2-desiredrun))
mydata2<-mydata2[order(mydata$nphase1, mydata2$meanshift, mydata2$Sigmashift),]
我尝试过两种不同的方式进行排名,但似乎都无法产生所需的结果。
r1<-data.frame(rank(mydata2$ARL_method1 [order(mydata2$nphase1, mydata2$meanshift, mydata$Sigmashift)]))
r1<-by(mydata2, mydata2$nphase1 & mydata2$meanshift & mydata$Sigmashift,function(x) rank(mydata2$ARL_method1))
这是我之前在 SAS 中编写的内容,我正在尝试将其转换为 R
proc rank data=study2 out=rankout;
var arl_method1 arl_method2;
by nphase1 meanshift sigmashift;
ranks ARL_Rank1 ARL_Rank2;
run;
欢迎提出任何建议
在 R 中有很多方法可以做到这一点,具体取决于您喜欢使用什么包。
您的 by
方法几乎是正确的,但您的第二个参数应该是包含列的列表,而不是使用 &
组合它们:
# using base R and 'by'
# have a look at this output - returns just the rank for each
# combo of (nphase1, meanshift, Sigmashift)
by(r1, r1[, c('nphase1', 'meanshift', 'Sigmashift')],
function (x) rank(x$ARL_method1))
这些选项都会向您的数据框添加一列 rank
,可能更有用(由于 nphase1/meanshift/sigmashift 的每个组合的 mutate(r1, rank=rank(ARL_method1))
)。
# base R using `by`. Same as before but add the ranks to the
# original dataframe (using `mutate`) and then `rbind` the rows
# together
do.call(rbind, by(r1, r1[, c('nphase1', 'meanshift', 'Sigmashift')],
mutate, rank=rank(ARL_method1)))
# plyr package
library(plyr)
ddply(r1, .(nphase1, meanshift, Sigmashift),
mutate, rank=rank(ARL_method1))
# dplyr package
library(dplyr)
r1 %>%
group_by(nphase1, meanshift, Sigmashift) %>%
mutate(rank=rank(ARL_method1))
# data.table package
library(data.table)
setDT(r1)[, rank:=rank(ARL_method1), by="nphase1,meanshift,Sigmashift"]
如果您经常进行此类操作,我建议您使用包而不是基础 R。这种操作在 dplyr/plyr/data.table 中非常自然。如果效率是一个问题,data.table
非常擅长快速连接、数据操作等,但学习曲线更陡峭。
我有一个包含 48,000 个观测值和 9 个变量的数据集。我正在尝试通过变量 nphase1、meanshift 和 sigmashift 来计算变量 arl_method1 的排名。 nphase1、均值、s-shift 的每个组合都有 1000 个观测值。我试图让 R 从 1 到 1000 对这些进行排名,但我看不到代码是否正确,而是根据整个数据集计算排名,因此它产生的排名高达 48k。 我的代码:
mydata<-read.table("C:\Users\Adam\Desktop\R\study2_total.csv", header=TRUE, sep=",")
mydata2<-data.frame(mydata, D1=abs(mydata$ARL_method1-desiredrun), D2=abs(mydata$ARL_method2-desiredrun))
mydata2<-mydata2[order(mydata$nphase1, mydata2$meanshift, mydata2$Sigmashift),]
我尝试过两种不同的方式进行排名,但似乎都无法产生所需的结果。
r1<-data.frame(rank(mydata2$ARL_method1 [order(mydata2$nphase1, mydata2$meanshift, mydata$Sigmashift)]))
r1<-by(mydata2, mydata2$nphase1 & mydata2$meanshift & mydata$Sigmashift,function(x) rank(mydata2$ARL_method1))
这是我之前在 SAS 中编写的内容,我正在尝试将其转换为 R
proc rank data=study2 out=rankout;
var arl_method1 arl_method2;
by nphase1 meanshift sigmashift;
ranks ARL_Rank1 ARL_Rank2;
run;
欢迎提出任何建议
在 R 中有很多方法可以做到这一点,具体取决于您喜欢使用什么包。
您的 by
方法几乎是正确的,但您的第二个参数应该是包含列的列表,而不是使用 &
组合它们:
# using base R and 'by'
# have a look at this output - returns just the rank for each
# combo of (nphase1, meanshift, Sigmashift)
by(r1, r1[, c('nphase1', 'meanshift', 'Sigmashift')],
function (x) rank(x$ARL_method1))
这些选项都会向您的数据框添加一列 rank
,可能更有用(由于 nphase1/meanshift/sigmashift 的每个组合的 mutate(r1, rank=rank(ARL_method1))
)。
# base R using `by`. Same as before but add the ranks to the
# original dataframe (using `mutate`) and then `rbind` the rows
# together
do.call(rbind, by(r1, r1[, c('nphase1', 'meanshift', 'Sigmashift')],
mutate, rank=rank(ARL_method1)))
# plyr package
library(plyr)
ddply(r1, .(nphase1, meanshift, Sigmashift),
mutate, rank=rank(ARL_method1))
# dplyr package
library(dplyr)
r1 %>%
group_by(nphase1, meanshift, Sigmashift) %>%
mutate(rank=rank(ARL_method1))
# data.table package
library(data.table)
setDT(r1)[, rank:=rank(ARL_method1), by="nphase1,meanshift,Sigmashift"]
如果您经常进行此类操作,我建议您使用包而不是基础 R。这种操作在 dplyr/plyr/data.table 中非常自然。如果效率是一个问题,data.table
非常擅长快速连接、数据操作等,但学习曲线更陡峭。