这是我的问题,对我来说很难......
我想生成多个数据集,然后将函数应用于这些数据集,并在单个或多个数据集中输出相应的输出(无论可能)......
我的例子,虽然我需要生成大量的变量和数据集
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)如果这是正确的方法,我该怎么做?
感谢您的关注,我将非常感谢您的帮助......
答案 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)
相同。
不要调用变量var
或matrix
,,因为它们会掩盖这些函数的名称。因为它令人困惑。
3:ncol(x)
很危险。如果x
少于3列,则表明它不符合您的想法。
......现在,你真正想解决的问题。
问题在于out <- lm(gdt[x]$yvar ~ gdt[x][, ind[ind]])
行。
lapply
将数据框传递到anovp
,而不是标记,因此x
是gdt[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]))