对一系列数据进行子集化

问题描述 投票:0回答:2

我正在尝试使用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循环中实现这一点。

任何人都可以推荐一种方法吗?

谢谢!

r loops subset
2个回答
0
投票

我们可以使用list将数据集转换为mget

lst1 <- mget(paste0("i", 1:10))

然后在list中进行子集化

lst2 <- lapply(lst1, function(x) subset(x, F > (abs(mean(F) + 2 * sd(F))))

0
投票

或者,我们可以将所有数据帧组合成一个大数据帧并按组应用操作。

这要求数据帧具有相同的结构,即相同的顺序,名称和列类型,这在这里似乎是这种情况。

对于数据帧的分组操作,我们可以使用data.tabledplyr语法(除了基本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

Reproducible data

这将在全局环境中创建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
© www.soinside.com 2019 - 2024. All rights reserved.