【问题标题】:Generating multiple datasets and applying function and output multiple dataset生成多个数据集并应用函数并输出多个数据集
【发布时间】:2011-09-04 13:38:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: r


    【解决方案1】:

    您的基本想法是正确的,您应该创建一个数据框列表,然后使用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 &lt;- 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]))
    

    【讨论】:

    • 很好的建议,除了不使用函数名称的理由。对象的名称保存在单独的列表中。创建一个名为“var”的对象不会掩盖var 函数,但这仍然不是一个好主意,因为人脑没有那么仔细地组织。
    • @DWin:没错,R 在确定是使用变量还是函数方面是合理的,但是在某些模棱两可的情况下确实会发生屏蔽。例如,在命令提示符下键入var,R 会打印函数定义。现在定义var &lt;- 1:5 并重复。这次打印了变量。
    • @RichieCotton 不错的答案,但我同意@DWin 关于屏蔽的看法——这不是问题。有关说明,请参阅 stackoverflow.com/q/6135868/602276。尽管有一个名为var 的新变量,但代码x &lt;- 1:5; var(x); var &lt;- "a"; var; var(x) 将按照您的预期执行所有操作。
    • 非常感谢...我尝试了以下方法-仍然不成功..我仍然不明白您的意思...“anovp
    猜你喜欢
    • 2011-02-21
    • 2023-04-08
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多