簡體   English   中英

R - 對許多數據集執行相同的操作

[英]R - Perform the same operations to many data sets

抱歉,如果這是一個重復的問題,如果答案存在於某處,我將不勝感激被指出。

我有一個包含許多因素的大型數據框,分類和連續的混合。 這是一個縮短的示例:

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])
}

我們可以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)
          })

為了完整起見,下面是我將如何在tidyverse執行此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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM