2014-06-07 128 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