生成多个数据集并应用函数并输出多个数据集

时间:2011-09-04 13:38:07

标签: r

这是我的问题,对我来说很难......

我想生成多个数据集,然后将函数应用于这些数据集,并在单个或多个数据集中输出相应的输出(无论可能)......

我的例子,虽然我需要生成大量的变量和数据集

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)如果这是正确的方法,我该怎么做?

感谢您的关注,我将非常感谢您的帮助......

1 个答案:

答案 0 :(得分: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,而不是标记,因此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]))