设置数据序列

时间:2019-04-19 08:55:46

标签: r loops subset

我正试图开始使用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循环中做到这一点。

有人能推荐一种方法吗?

谢谢!

2 个答案:

答案 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.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

可复制的数据

这将在全局环境中创建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