根据R中的子类别对数据进行排名

时间:2015-07-24 18:22:50

标签: r rank

我有48,000个观测数据和9个变量的数据集。我试图通过变量nphase1,meanshift和sigmashift来计算变量arl_method1的排名。对于nphase1,mean,s-shift的每种组合,有1000个观察值。我试图让R从1到1000排名,但我不能看到正确的代码,而是根据整个数据集计算排名,所以它产生高达48k的排名。 我的代码:

echo $_GET['id'];
if(isset($_GET['id']))
{
    $id=$_GET['id'];
    //  ......

我试图以两种不同的方式进行排名,似乎都不会产生所需的输出。

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),]

这是我之前在SAS中写过的,我正在尝试转换为R

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))

任何建议表示赞赏

1 个答案:

答案 0 :(得分:1)

在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,可能更有用(根据mutate(r1, rank=rank(ARL_method1))对每个nphase1 / meanshift / sigmashift组合而言。

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