【问题标题】:subsetting a sequence of data对数据序列进行子集化
【发布时间】:2019-04-19 08:55:46
【问题描述】:

我正在尝试开始使用 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


    【解决方案1】:

    我们可以将数据集放入list 和mget

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

    然后在list 中进行子集化

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

    【讨论】:

      【解决方案2】:

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

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

      对于数据帧上的分组操作,我们可以使用 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
      

      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
      

      【讨论】:

        猜你喜欢
        • 2013-08-15
        • 2016-09-28
        • 2022-01-23
        • 2017-07-29
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 2019-09-26
        • 2017-11-21
        相关资源
        最近更新 更多