我正试图开始使用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循环中做到这一点。
有人能推荐一种方法吗?
谢谢!
答案 0 :(得分:0)
我们可以使用list
将数据集放入mget
lst1 <- mget(paste0("i", 1:10))
,然后在list
lst2 <- lapply(lst1, function(x) subset(x, F > (abs(mean(F) + 2 * sd(F))))
答案 1 :(得分:0)
或者,我们可以将所有数据帧组合为一个大数据帧,并按组应用操作。
这要求数据帧具有相同的结构,即,列的顺序,名称和类型相同,在这里似乎就是这种情况。
对于在数据帧上进行分组操作,我们可以使用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