2014-06-07 171 views
0

我有一个带有ID号和观察值数的数据集。我正在写一个函数来显示基于用户选择的ID的输出。数据集的ID从1到332以及相应的观察值。运行函数时输出的顺序与顺序不匹配

下面是我写的代码:

complete=function(directory,id=1:332){ 
    directory=read.csv(paste(path,"complete.csv",sep=""),header=TRUE,sep=",") 
    as.data.frame.matrix(directory) 

    mydf=na.omit(directory) 

    library(plyr) 

    completecount=count(mydf$ID) 
    colnames(completecount)=c("ID","nobs") 
    as.data.frame.matrix(completecount) 
    complete=subset(completecount,select=c(ID,nobs),subset=(completecount$ID%in%id)) 
    return(complete) 
} 

当我试图运行此

complete("specdata",4:2) 

我想看到的顺序输出下面基于上述

输入
ID nobs 
2 4 474 
3 3 243 
4 2 1041 

虽然我看到输出顺序如下所示

ID nobs 
2 2 1041 
3 3 243 
4 4 474 

请告诉我的代码有什么问题。

感谢您的帮助!

+0

这些对'as.data.frame.matrix'的调用是什么?他们似乎没有做任何事情,因为你没有保存结果。 – MrFlick

回答

2

你的函数中没有任何东西可以确保任何顺序。我不确定您是否认为%in%运营商也会进行排序,但它不会。无论第二个参数的顺序如何,它都会返回值。您要返回行的顺序是它们在原始表中的顺序。

%in%不同,match()实际上按顺序返回值。你可以这样做

library(plyr) 

complete=function(directory,id=1:332){ 
    directory=read.csv(paste(path,"complete.csv",sep=""),header=TRUE,sep=",") 
    as.data.frame.matrix(directory) 

    mydf=na.omit(directory) 

    completecount=count(mydf$ID) 
    colnames(completecount)=c("ID","nobs") 
    as.data.frame.matrix(completecount) 
    return(completecount[match(id, completecount$ID), ]) 
} 

这将在摘去他们他们传递给函数的顺序排出来的completecount

+0

非常感谢!此代码工作。 – ksp585