如何根据不同的值范围将数据框拆分为数据框列表

时间:2020-03-22 16:59:13

标签: r dplyr

我想根据数值变量的不同范围将数据框拆分为数据框列表。

说明性数据

set.seed(123)
df <- data.frame(
  subject = LETTERS[1:10],
  weight = sample(1:1000, 10)
)
df
   subject weight
1        A    288
2        B    788
3        C    409
4        D    881
5        E    937
6        F     46
7        G    525
8        H    887
9        I    548
10       J    453

我想根据变量weight的这些限制,列出4个较小的数据框:

limits <- c(250, 500, 750, 1000)

也就是说,我要跟踪的是数据帧列表中的一个数据帧,其中weight0-250的范围内,另一个数据weight在{{1 }},范围从251-500开始,依此类推-换句话说,范围是不同的。

到目前为止,我一直在尝试这种501-750解决方案,该解决方案输出5个数据帧的列表,但具有累积范围:

dyplr

如何固定此代码,或者可以使用其他代码,以便根据 distinct limits <- c(250, 500, 750, 1000) lapply(limits, function(x) {df %>% filter(weight <= x)}) [[1]] [1] subject weight <0 rows> (or 0-length row.names) [[2]] subject weight 1 F 46 [[3]] subject weight 1 A 288 2 C 409 3 F 46 4 J 453 [[4]] subject weight 1 A 288 2 C 409 3 F 46 4 G 525 5 I 548 6 J 453 [[5]] subject weight 1 A 288 2 B 788 3 C 409 4 D 881 5 E 937 6 F 46 7 G 525 8 H 887 9 I 548 10 J 453 范围获得数据帧列表?

2 个答案:

答案 0 :(得分:4)

也许:

library(dplyr)

df %>%
  group_split(group = findInterval(weight, limits))

输出:

[4]>
[[1]]
# A tibble: 4 x 3
  subject weight group
  <fct>    <int> <int>
1 C          179     0
2 E          195     0
3 H          118     0
4 J          229     0

[[2]]
# A tibble: 3 x 3
  subject weight group
  <fct>    <int> <int>
1 A          415     1
2 B          463     1
3 I          299     1

[[3]]
# A tibble: 1 x 3
  subject weight group
  <fct>    <int> <int>
1 D          526     2

[[4]]
# A tibble: 2 x 3
  subject weight group
  <fct>    <int> <int>
1 F          938     3
2 G          818     3

如果要删除输出中的keep = FALSE列,只需使用group_split作为group的附加参数。

答案 1 :(得分:1)

R的基本内衬可以将数据limits分割。

split(df, findInterval(df$weight, limits))
#$`0`
#   subject weight
#3        C    179
#5        E    195
#8        H    118
#10       J    229
#
#$`1`
#  subject weight
#1       A    415
#2       B    463
#9       I    299
#
#$`2`
#  subject weight
#4       D    526
#
#$`3`
#  subject weight
#6       F    938
#7       G    818
相关问题