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

时间:2014-07-11 23:11:12

标签: r split subset

我有这样的数据集:

Users   Age
1        2
2        7
3        10
4        3
5        8
6        20

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

3 个答案:

答案 0 :(得分:9)

您可以将splitcut结合使用,只需在一行代码中执行此操作,从而无需为不同的数据范围分配一堆不同的表达式:

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)

cut根据指定的断点分割数据,split根据提供的类别拆分数据框。如果您将此计算的结果存储到名为l的列表中,则可以使用l[[1]]l[[2]]l[[3]]或更详细的访问较小的数据框:< / p>

l$`[0,5]`
l$`(5,10]`
l$`(10, 15]`

答案 1 :(得分:1)

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

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

  Users Age
1     1   2
4     4   3

这是您的第二个年龄为6-10岁的人:subset(foo,Age<=10&Age>=6)

  Users Age
2     2   7
3     3  10
5     5   8

您的第三个(使用subset(foo,Age<=15&Age>=11))为空 - 您的上次Age观察结果超过15个。

另请注意,将排除5到6或10到11之间的小数年龄(例如,5.1,10.5),因为此代码非常符合您的问题。如果您希望年龄小于6岁的人进入第一组,只需将该代码修改为subset(foo,Age<6&Age>=0)即可。如果您不想在第二组中使用Age=5.1的假设人,则该群组的代码将为subset(foo,Age<=10&Age>5)

答案 2 :(得分:0)

我们还可以使用between包中的data.table函数。

# Create a data frame
dat <- data.frame(Users = 1:7, Age = c(2, 7, 10, 3, 8, 12, 15))

# Convert the data frame to data table by reference
# (data.table is also a data.frame)
setDT(dat)

# Define a list with the cut pairs
cuts <- list(c(0, 5), c(6, 10), c(11, 15))

# Cycle through dat and cut it into list of data tables by the values in Age
# matching the defined cuts
lapply(X = cuts, function(i) {
  dat[between(x = dat[ , Age], lower = i[1], upper = i[2])]
})

输出:

[[1]]
   Users Age
1:     1   2
2:     4   3

[[2]]
   Users Age
1:     2   7
2:     3  10
3:     5   8

[[3]]
   Users Age
1:     6  12
2:     7  15

还有许多其他可能,包括按组进行,data.table非常灵活。