2013-10-23 98 views
0

我有限的心智能力意味着我真的很努力地在R中執行以下任務,任何建議都會被感激地接收!計算多個數據框和商店內多列的模式

我有100個數據框當前存儲爲列表(my.dfs)。在每個數據框中有六列(a,b,c,d,e,f)。行號在數據幀(80-150)之間變化,但我認爲這是不相關的。所有列都是數字。

我想計算數據框1中的列a,然後數據框2,3,4 ...到數據框100的模式,並將結果存儲在新的矢量(a.mode)中。所以a.mode應該有100個模式值,每個來自一個數據幀。然後我想對b,c,d,e,f這兩個可以有自己的向量的列(b.mode,c.mode等)重複這一點。

我的問題是R中的計算模式似乎並不簡單。我用的是包(modeest)和命令:

mlv(column.here, method="mfv") 

所以我的代碼目前看起來是這樣的:

library(modeest) 
my.dfs 
a.mode<-NULL 

for(j in my.dfs){ 
a.mode<-c(a.mode, mlv(j[,"column.a"], method="mfv")) 
} 

然而,這給人的產出是不正確的雜亂。

同樣地,我曾嘗試:

for(j in my.dfs){ 
a.mode<-c(a.mode, mlv(j$column.a, method="mfv")) 
} 

但我得到的錯誤命令:

Error in j$column.a : $ operator is invalid for atomic vectors 

我人還試圖使我的列表分爲100個獨立dataframes,看是否運行在單獨的dataframes循環會更有效。但是,我沒有超出分離我的清單到100個dataframes:

t<-1:100 
for (q in 1:length(t)){ 
assign(paste("metric.data", t[q], sep=""), data.frame(subset(my.dfs[[q]]))) 
} 

我不知道我怎麼可能還運行在所有100個dataframes計算模式column.a每個數據幀和商店內的循環他們在一個向量(a.mode)中,然後像上面描述的那樣對column.b,column.c等進行重複。

任何想法和代碼將是非常美妙

回答

1

有幾個問題與您的代碼:

  1. 應該for (j in 1:my.dfs) {...}否則循環將循環,因爲j只有一次沒有把所有的值在1my.dfs之間。

  2. 什麼是my.dfs畢竟?它看起來並不像你在爲它分配任何東西?如果您希望循環的數量與列表my.dfs(假設它是dfs列表)中的數據幀一樣多,您應該嘗試使用runs <- length(my.dfs)for (j in 1:runs) {...}

  3. 您使用j很可能是此處錯誤消息的原因。它看起來像你試圖使用j作爲my.dfs中的元素的佔位符,但它不起作用。相反,你應該這樣做:mlv(my.dfs[[j]],method="mfv")。同樣,錯誤消息告訴你j是一個原子向量。它不包含您的數據框。至於我可以正確解釋,看你的代碼,它甚至不應該包含一個原子向量,而是一個列表(再次,假設my.dfs是一個dfs列表)。

  4. 還有一些其他問題,我建議,下次您提問時,請確保您的代碼是正確的和/或不只是僞代碼,因爲它使您的問題非常混亂。

如果我正確理解你的代碼背後的實際問題,你的問題是,mlv輸出實際上是一個列表,而不是一個單一的值。如果你想要單一的值,你可以這樣訪問它:

my.data <- matrix(rnorm(1:10,5),byrow=F,nrow=10,ncol=5) # create example data 
list.of.modes <- apply(my.data,2,mlv,method="mfv") # get the mode 
vector.of.modes <- NULL # create the vector we want 
for (i in 1:length(list.of.modes)) { 
    vector.of.modes[i] <- list.of.modes[[i]]$M #<---This is the interesting line 
} 

這應該對數據框和您的示例類似的工作。你必須適應它,因爲我發佈的代碼只是儘可能的解釋它背後的原理。