在data.frame中拆分连续数据

时间:2013-04-02 08:19:59

标签: r split

我的数据结构是

id value1 value2
1  0.12   1
2  0.09   0
3  0.05   0
4  0.65   1
5  0.68   0
...

我需要使用value1来分割数据,这样0< value1< = 0.2 == 1或0.2< value1< = 0.4 == 2 ...(最大value1为1,最小value1为0)

我的观点是,我想利用value1范围作为分裂的参考。

所以,我希望结果。

id value1 value2 group
1  0.12   1      1 (because value1 is range of 0~0.2)
2  0.09   0      1 (because value1 is range of 0~0.2)
3  0.05   0      1 (because value1 is range of 0~0.2)
4  0.65   1      4 (because value1 is range of 0.6~0.8)
5  0.68   0      4 (because value1 is range of 0.6~0.8)
...

组向量不能具有值2或3.这是因为value1不包括0.2~0.4和0.4~0.6的范围。

另外,我需要按组计算value2因子的比率。

根据以上数据,group1由33.33%1和66.66%0组成。此外,group4由50%1和50%0组成。

我该如何处理这个问题?

2 个答案:

答案 0 :(得分:3)

您可以使用cut功能。首先创建一些示例数据:

dd = data.frame(id = 1:20, value1=runif(20))

接下来,定义断点并划分value1

cuts = cut(dd$value1, breaks=seq(0, 1, 0.2))

然后将剪切转换为数字(使用某些因素魔法),以获得您想要的内容:

as.numeric(cuts)

所以

dd$group = as.numeric(cut(dd$value1, breaks=seq(0, 1, 0.2)))

答案 1 :(得分:1)

您可以简单地执行以下操作

DF <- read.table(text='id value1 value2
1  0.12   1
2  0.09   0
3  0.05   0
4  0.65   1
5  0.68   0', header=TRUE)

DF$group <- (DF$value1)%/%0.201 + 1

DF
##   id value1 value2 group
## 1  1   0.12      1     1
## 2  2   0.09      0     1
## 3  3   0.05      0     1
## 4  4   0.65      1     4
## 5  5   0.68      0     4

# to get % of '1' in each group
result <- aggregate(value2 ~ group, DF, function(x) sum(x)/length(x))
result
##   group    value2
## 1     1 0.3333333
## 2     4 0.5000000