根据多个条件将数据帧子集分成多个

Subset dataframe into multiple based on multiple conditions

请注意,我是 R 的新手

我有一个大型数据框,我想根据列值的开头将其子集化为多个数据框。 所以 'MS' 列有 6 个重复值,大约 60 个唯一值。我想为每个以相同变量 letter/s 开头的唯一值创建一个数据框。有点令人困惑,但我希望它在下面的示例中更有意义。

有没有办法自动执行此操作?我设法做到了一个,但手动为每个变量这样做听起来不太好。

D_MtC <- structure(list(MS = c("bl1", "bl1", "bl1", "bl1", "bl1", "bl1", 
                      "bl2", "bl2", "bl2", "bl2", "bl2", "bl2", "bu1", "bu1", "bu1", 
                      "bu1", "bu1", "bu1", "bu10", "bu10"), 
                      MtC = c(276.9171211, 276.9171211, 276.9171211, 
                              276.9171211, 276.9171211, 276.9171211, 
                              287.5640738, 287.5640738, 287.5640738, 
                              287.5640738, 287.5640738, 287.5640738, 
                              145.5970013, 145.5970013, 145.5970013, 
                              145.5970013, 145.5970013, 145.5970013, 
                              21.16157907, 21.16157907), 
                      Rainfall = c(2L, 0L, 61L, 5L, 0L, 28L, 1L, 0L, 35L, 2L, 0L, 7L, 
                            0L, 0L, 16L, 2L, 1L, 4L, 0L, 0L)),
                    row.names = c(NA, 20L), class = "data.frame")
D_MtC
#>      MS       MtC Rainfall
#> 1   bl1 276.91712        2
#> 2   bl1 276.91712        0
#> 3   bl1 276.91712       61
#> 4   bl1 276.91712        5
#> 5   bl1 276.91712        0
#> 6   bl1 276.91712       28
#> 7   bl2 287.56407        1
#> 8   bl2 287.56407        0
#> 9   bl2 287.56407       35
#> 10  bl2 287.56407        2
#> 11  bl2 287.56407        0
#> 12  bl2 287.56407        7
#> 13  bu1 145.59700        0
#> 14  bu1 145.59700        0
#> 15  bu1 145.59700       16
#> 16  bu1 145.59700        2
#> 17  bu1 145.59700        1
#> 18  bu1 145.59700        4
#> 19 bu10  21.16158        0
#> 20 bu10  21.16158        0

对包含以 'bu'

开头的所有变量的数据框进行子投注
MtC_bu <- D_MtC[grep("bu.*", D_MtC$MS),]
MtC_bu
#>      MS       MtC Rainfall
#> 13  bu1 145.59700        0
#> 14  bu1 145.59700        0
#> 15  bu1 145.59700       16
#> 16  bu1 145.59700        2
#> 17  bu1 145.59700        1
#> 18  bu1 145.59700        4
#> 19 bu10  21.16158        0
#> 20 bu10  21.16158        0

这是“MS”中唯一值的完整列表 所以我真的只想从原始数据帧制作 7 个数据帧,每个独特的开头 1 个 letter/s。例如,对于数据框 bu,我希望它包含包含 bu1-21

的所有行
MS
#>    MS_u c.1.63.
#> 1   bl1       1
#> 2   bl2       2
#> 3   bu1       3
#> 4  bu10       4
#> 5  bu11       5
#> 6  bu12       6
#> 7  bu13       7
#> 8  bu14       8
#> 9  bu16       9
#> 10 bu17      10
#> 11 bu18      11
#> 12 bu19      12
#> 13  bu2      13
#> 14 bu21      14
#> 15  bu3      15
#> 16  bu6      16
#> 17  bu7      17
#> 18  bu8      18
#> 19  bu9      19
#> 20   d1      20
#> 21   d2      21
#> 22   d3      22
#> 23   d4      23
#> 24   f1      24
#> 25  f11      25
#> 26  f16      26
#> 27  f18      27
#> 28  f29      28
#> 29   f3      29
#> 30  f30      30
#> 31  f31      31
#> 32  f32      32
#> 33  f33      33
#> 34  f34      34
#> 35  f35      35
#> 36  f37      36
#> 37   f4      37
#> 38  f40      38
#> 39  f44      39
#> 40  f47      40
#> 41  f49      41
#> 42   f5      42
#> 43  f50      43
#> 44  f51      44
#> 45   f6      45
#> 46   f7      46
#> 47   f8      47
#> 48   f9      48
#> 49   h2      49
#> 50   h3      50
#> 51   o1      51
#> 52   o2      52
#> 53   o3      53
#> 54   o4      54
#> 55   o5      55
#> 56  pi1      56
#> 57  pi2      57
#> 58  pi3      58
#> 59  pi4      59
#> 60  pl1      60
#> 61  pl2      61
#> 62  pr1      62
#> 63  pr2      63

MS 列中删除数字并在 split 中使用它根据模式将一个数据帧拆分为数据帧列表。

result <- split(D_MtC, sub('\d+', '', D_MtC$MS))

sub 的输出是:

sub('\d+', '', D_MtC$MS)

#[1] "bl" "bl" "bl" "bl" "bl" "bl" "bl" "bl" "bl" "bl" "bl" 
#     "bl" "bu" "bu" "bu" "bu" "bu" "bu" "bu" "bu"