我有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))
任何建议表示赞赏
答案 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
非常擅长快速连接,数据操作等,但学习曲线更陡峭。