如何根据R中的列值范围拆分数据框?

use*_*482 6 split r subset

我有这样的数据集:

Users   Age
1        2
2        7
3        10
4        3
5        8
6        20
Run Code Online (Sandbox Code Playgroud)

如何将此数据集拆分为3个数据集,其中第一个数据集由年龄介于0-5之间,第二个为6-10,第三个为11-15的所有用户组成?

jos*_*ber 9

您可以在一行代码中结合split使用cut,无需为不同的数据范围使用一堆不同的表达式进行子集化:

split(dat, cut(dat$Age, c(0, 5, 10, 15), include.lowest=TRUE))
# $`[0,5]`
#   Users Age
# 1     1   2
# 4     4   3
# 
# $`(5,10]`
#   Users Age
# 2     2   7
# 3     3  10
# 5     5   8
# 
# $`(10,15]`
# [1] Users Age  
# <0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)

cut根据指定的断点split分割数据,并根据提供的类别拆分数据帧.如果您存储在该计算到一个名为列表的结果l,你可以用访问更小的数据帧l[[1]],l[[2]]以及l[[3]]或更复杂的:

l$`[0,5]`
l$`(5,10]`
l$`(10, 15]`
Run Code Online (Sandbox Code Playgroud)


Nic*_*ner 1

首先,这是用于我的目的的数据集:foo=data.frame(Users=1:6,Age=c(2,7,10,3,8,20))

\n\n

这是您的第一个数据集,年龄为 0\xe2\x80\x935:subset(foo,Age<=5&Age>=0)

\n\n
  Users Age\n1     1   2\n4     4   3\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是您的第二个,年龄为 6\xe2\x80\x9310:subset(foo,Age<=10&Age>=6)

\n\n
  Users Age\n2     2   7\n3     3  10\n5     5   8\n
Run Code Online (Sandbox Code Playgroud)\n\n

你的第三个(使用subset(foo,Age<=15&Age>=11))是空的 \xe2\x80\x93 你最后的Age观察结果超过 15。

\n\n

另请注意,5 至 6 岁或 10 至 11 岁之间的分数年龄(例如 5.1、10.5)将被排除,因为此代码与您的问题非常匹配。如果您希望年龄小于 6 岁的人进入第一组,只需将该代码修改为subset(foo,Age<6&Age>=0)。如果您更喜欢第二组中的假设人员Age=5.1,则该组的代码将为subset(foo,Age<=10&Age>5)

\n