2011-09-04 99 views
4

這裏是我的問題,只是對我來說很難...生成多個數據集和應用功能,並輸出多個數據集

我想生成多個數據集,然後應用功能,這些數據集,並輸出相應的輸出在單個或多個數據集(一切可能)...

我的例子,雖然我需要生成大量的變量和數據集

seed <- round(runif(10)*1000000) 

datagen <- function(x){ 
set.seed(x) 
var <- rep(1:3, c(rep(3, 3))) 
yvar <- rnorm(length(var), 50, 10) 
matrix <- matrix(sample(1:10, c(10*length(var)), replace = TRUE), ncol = 10) 
mydata <- data.frame(var, yvar, matrix) 
} 

gdt <- lapply (seed, datagen) 

# resulting list (I believe is correct term) has 10 dataframes: 
# gdt[1] .......to gdt[10] 

# my function, this will perform anova in every component data frames and 
#output probability coefficients... 
anovp <- function(x){ 
      ind <- 3:ncol(x) 
      out <- lm(gdt[x]$yvar ~ gdt[x][, ind[ind]]) 
      pval <- out$coefficients[,4][2] 
      pval <- do.call(rbind,pval) 
     } 

plist <- lapply (gdt, anovp) 

Error in gdt[x] : invalid subscript type 'list' 

這不是工作,我嘗試了不同的選擇。但無法弄清楚......最後決定打擾專家,對不起那個......

我的問題是:

(1)這是可能以這種方式來處理這樣的情況或有其他選擇處理這樣創建的多個數據集?

(2)如果這是正確的方法,我該怎麼做?

感謝您的關注,我會感謝您的幫助......

回答

7

你的基本思想權,應創建數據幀的列表,然後使用lapply到功能應用到的每個元素列表。不幸的是,你的代碼中有幾個古怪的東西。

隨機生成種子,然後設置它沒有意義。您只需使用set.seed即可使隨機數字具有可重現性。剪切線

seed <- round(runif(10)*1000000) 

,也許

set.seed(x) 

rep(1:3, c(rep(3, 3)))相同rep(1:3, each = 3)


不要叫你的變量varmatrix因爲它們會掩蓋這些函數的名稱。,因爲它很混亂。


3:ncol(x)是危險的。如果x的列數小於3,則它不會執行您認爲的操作。


......現在,你真正想解決的問題。

問題出在線out <- lm(gdt[x]$yvar ~ gdt[x][, ind[ind]])

lapply傳遞數據幀到anovp,不indicies,所以xgdt[x]的數據幀。這會引發錯誤。


還有一件事。在重寫該行時,請注意lm需要數據參數,因此您不需要執行以下操作:gdt$some_column;你可以直接參考some_column


編輯:進一步的建議。

您似乎總是使用公式yvar ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10。由於每次都一樣,請在致電lapply之前創建它。

independent_vars <- paste(colnames(gdt[[1]])[-1:-2], collapse = " + ") 
model_formula <- formula(paste("yvar", independent_vars, sep = " ~ ")) 

我可能不會打擾anovp函數。只要做到

models <- lapply(gdt, function(data) lm(model_formula, data)) 

然後包括進一步的呼叫lapply在必要時與係數玩。下一行復制您的anovp代碼,但不起作用,因爲model$coefficients是一個向量(所以維度不正確)。調整以檢索您實際需要的位。

coeffs <- lapply(models, function(model) do.call(rbind, model$coefficients[,4][2])) 
+0

除了沒有使用函數名稱的基本原理之外的好建議。對象的名稱保存在單獨的列表中。創建一個名爲「var」的對象不會掩蓋'var'函數,但它仍然不是一個好主意,因爲人類大腦的組織不夠精細。 –

+0

@DWin:確實,在判斷是使用變量還是函數時,R是合理的,但是在掩蓋發生時存在一些不明確的情況。例如,在命令提示符處鍵入'var',然後R打印函數定義。現在定義'var < - 1:5'並重復。這一次打印了可變物。 –

+0

@RichieCotton尼斯答案,但我同意@DWin有關掩蔽 - 這不是一個問題。請參閱http://stackoverflow.com/q/6135868/602276獲取解釋。代碼'x < - 1:5; VAR(X); var < - 「a」; VAR;儘管事實上存在一個名爲'var'的新變量,var(x)'將盡你所能地完成所有事情。 – Andrie