2011-09-04 39 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