我想根据数值变量的不同范围将数据框拆分为数据框列表。
说明性数据:
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)
也就是说,我要跟踪的是数据帧列表中的一个数据帧,其中weight
在0-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
范围获得数据帧列表?
答案 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