根据多个条件将数据帧子集分成多个
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"
请注意,我是 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"