【问题标题】:R - Perform the same operations to many data setsR - 对许多数据集执行相同的操作
【发布时间】:2020-03-09 18:22:23
【问题描述】:

抱歉,如果这是一个重复的问题,如果答案存在于某个地方,我将不胜感激。

我有一个包含许多因素的大型数据框,既有分类的也有连续的。这是一个简短的示例:

x1 = sample(x = c("A", "B", "C"), size = 50, replace = TRUE)
x2 = sample(x = c(5, 10, 27), size = 50, replace = TRUE)
y = rnorm(50, mean=0)

dat = as.data.frame(cbind(y, x1, x2))
dat$x2 = as.numeric(dat$x2)
dat$y = as.numeric(dat$y)

> head(dat)
   y x1 x2
1  9  C  2
2  7  C  2
3  8  B  1
4 21  A  2
5 48  A  1
6 19  A  3

我想为 x1 的每个级别对这个数据集进行子集化,因此我最终为因子 x1 的每个级别创建了 3 个新数据集。我可以通过以下方式做到这一点:

#A
dat.A = dat[which(dat$x1== "A"),,drop=T]
dat.A$x1 = factor(dat.A$x1)

#B
dat.B = dat[which(dat$x1== "B"),,drop=T]
dat.B$x1 = factor(dat.B$x1)

#C
dat.C = dat[which(dat$x1== "C"),,drop=T]
dat.C$x1 = factor(dat.C$x1)

这有点乏味,因为我的真实数据有 7 个级别的感兴趣因子,所以我必须重复代码 7 次。在全局环境中拥有每个新数据框后,我想对每个数据框执行多个功能(绘图、创建表格、拟合线性模型)。这是一个简单的例子:

#same plot for each dataset
A.plot = plot(dat.A$y, dat.A$x2)
B.plot = plot(dat.B$y, dat.B$x2)
C.plot = plot(dat.C$y, dat.C$x2)

#same models for each dataset
mod.A = lm(y ~ x2, data = dat.A)
summary(mod.A)
mod.B = lm(y ~ x2, data = dat.B)
summary(mod.B)
mod.C = lm(y ~ x2, data = dat.C)
summary(mod.C)

这需要大量的复制和粘贴。有没有一种方法可以为我想做的每一件事写一行代码并遍历每个数据集?如下所示,我知道这是错误的,但这是我想要做的:

for (i in datasets) {
  [i].plot = plot(dat.[i]$y, dat.[i]$x2)
  mod.[i] = lm(y ~ x2, data = dat[i])
}

【问题讨论】:

    标签: r loops dataframe


    【解决方案1】:

    我们可以将split 转换为data.frames 的list,然后使用lapply 循环遍历list

    lst1 <- split(dat, dat$x1)
    lst2 <- lapply(lst1, function(dat) {
                 plt <- plot(dat$y, dat$x2)
                 model <- lm(y ~ x2, data = dat)
                 list(plt, model)
              })
    

    【讨论】:

    • 分割功能很好用,谢谢!我只是不确定如何用 lapply 遍历这个列表来获得我在上面运行的图和模型。有什么指点吗?
    • @user3397113 更新了帖子。您可以在每个列表中拥有模型和绘图对象的list
    【解决方案2】:

    为了完整起见,我将在 tidyverse 中执行此操作,生成两个列表:一个包含绘图,另一个包含模型。

    library(dplyr)
    library(ggplot2)
    
    model_list <- dat %>%
      group_by(x1) %>%
      group_map( ~ lm(y ~ x2, data = .x))
    
    plot_list <- dat %>%
      group_by(x1) %>%
      group_map( ~ ggplot(.x, aes(x2, y)) + geom_point())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2020-04-23
      • 1970-01-01
      相关资源
      最近更新 更多