根据 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 非常擅长快速连接、数据操作等,但学习曲线更陡峭。