Кроме того, мы можем объединить все фреймы данных в один большой фрейм данных и применить операции по группам .
Для этого требуется, чтобы фреймы данных имели одинаковую структуру, т. Е. Одинаковый порядок, имя и тип столбцов, что, как представляется, имеет место в данном случае.
Для групповых операций над фреймами данных мы можем использовать синтаксис data.table
или dplyr
(помимо базовых функций R).
data.table
library(data.table)
list_of_df <- mget(paste0("i", 1:10))
big_dt <- rbindlist(list_of_df, idcol = "orig.df")
big_dt[, .SD[!F %between% (mean(F) + c(-2, +2) * sd(F))], by = orig.df]
orig.df rn F x
1: i2 6 20 P
2: i3 6 30 M
3: i4 6 40 I
4: i5 6 50 Y
5: i6 6 60 U
6: i7 6 70 T
7: i8 6 80 F
8: i9 6 90 G
9: i10 6 100 F
dplyr
library(dplyr)
list_of_df <- mget(paste0("i", 1:10))
big_df <- list_of_df %>%
bind_rows(.id = "orig.df")
big_df %>%
group_by(orig.df) %>%
filter(!between(F, mean(F) - 2 * sd(F), mean(F) + 2 * sd(F)))
# A tibble: 9 x 4
# Groups: orig.df [9]
orig.df rn F x
<chr> <int> <dbl> <chr>
1 i2 6 20 P
2 i3 6 30 M
3 i4 6 40 I
4 i5 6 50 Y
5 i6 6 60 U
6 i7 6 70 T
7 i8 6 80 F
8 i9 6 90 G
9 i10 6 100 F
Воспроизводимые данные
Это создаст 10 фреймов данных в глобальной среде.
set.seed(1L)
n_row <- 6L
for (x in 1:10) {
df_name <- paste0("i", x)
assign(df_name,
data.frame(
rn = seq(n_row),
F = c(rnorm(n_row - 1, mean = x), 10*x),
x = sample(LETTERS, n_row, replace = TRUE),
stringsAsFactors = FALSE
),
envir = globalenv())
}
ls()
[1] "df_name" "i1" "i10" "i2" "i3" "i4" "i5" "i6" "i7" "i8" "i9"
[12] "n_row" "x"
Каждый фрейм данных состоит из 6 строк, где одна строка содержит выброс в F
, например,
i3
rn F x
1 1 2.983810 U
2 2 3.943836 O
3 3 3.821221 N
4 4 3.593901 U
5 5 3.918977 A
6 6 30.000000 M