我正在尝试使用R进行数据分析,并且我对一系列数据帧的子集有疑问。
所以,假设我有名为i1,i2,i3,...,i10的数据帧
我想将这些数据帧子集化并将结果分配给sub1,sub2,sub3,...,sub10。然后结合结果。
我想要的每个数据框是:
sub1 <- subset(i1, F < (mean(i1$F)-2*sd(i1$F)) |
F > (mean(i1$F)+2*sd(i$F)))
然而,尝试分配和粘贴,也通过创建一个i1,..,i10的列表,但我无法在for循环中实现这一点。
任何人都可以推荐一种方法吗?
谢谢!
我们可以使用list
将数据集转换为mget
lst1 <- mget(paste0("i", 1:10))
然后在list
中进行子集化
lst2 <- lapply(lst1, function(x) subset(x, F > (abs(mean(F) + 2 * sd(F))))
或者,我们可以将所有数据帧组合成一个大数据帧并按组应用操作。
这要求数据帧具有相同的结构,即相同的顺序,名称和列类型,这在这里似乎是这种情况。
对于数据帧的分组操作,我们可以使用data.table
或dplyr
语法(除了基本R函数)。
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
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