如何根据百分比划分数据集?

时间:2015-02-23 23:32:30

标签: r

我有这样的数据集

ID      var value
9442000 a   2.01
9442000 v   2.2
9442000 h   5.3
9442000 f   0.2
9442000 s   0.55
9442000 t   0.6
952001  d   0.22
952001  g   0.44
952001  g   0.44
952001  h   0.77
652115  a   4.66
652115  d   1.55
652115  s   2.55
652115  s   2.55

我想将其分为两个数据帧进行校准(75%)和验证(25%)。为整体做这件事很容易,但我想在ID方面做到这一点。所以基本上,我想确保75%的 EACH ID进行校准。例如,对于ID 9442000 ,我想将任意四个事件(随机)放入校准,将2放入验证数据帧。

预期产出:

*Calibration*
 ID var value
9442000 a   2.01
9442000 v   2.2
9442000 h   5.3
9442000 f   0.2
952001  d   0.22
952001  g   0.44
952001  g   0.44
652115  a   4.66
652115  d   1.55
652115  s   2.55

*validation*
ID  var value
9442000 s   0.55
9442000 t   0.6
952001  h   0.77
652115  s   2.55

2 个答案:

答案 0 :(得分:3)

我认为你想要一个随机的sample而我原来的ave方法因为段太短而熄火,所以我转向tapplyunlist - 结果

calib <- dat[ unlist( tapply(rownames(dat), dat$ID, 
                                        FUN=function(x) sample(x, .75*length(x)))), ]
valid <- dat[ !rownames(dat) %in% rownames(calib) , ]
#---------------
> str(calib)
'data.frame':   10 obs. of  3 variables:
 $ ID   : int  652115 652115 652115 952001 952001 952001 9442000 9442000 9442000 9442000
 $ var  : Factor w/ 8 levels "a","d","f","g",..: 1 6 2 4 2 4 7 8 1 6
 $ value: num  4.66 2.55 1.55 0.44 0.22 0.44 0.6 2.2 2.01 0.55
> str(valid)
'data.frame':   4 obs. of  3 variables:
 $ ID   : int  9442000 9442000 952001 652115
 $ var  : Factor w/ 8 levels "a","d","f","g",..: 5 3 5 6
 $ value: num  5.3 0.2 0.77 2.55
> 

答案 1 :(得分:2)

首先,为其所在的组定义变量,然后使用split

> df$test <- ave(df$ID,df$ID,FUN=function(X) seq_along(X) %% 4 == 1  )
> 
> split(df, df$test)
$`0`
        ID var value test
2  9442000   v  2.20    0
3  9442000   h  5.30    0
4  9442000   f  0.20    0
6  9442000   t  0.60    0
8   952001   g  0.44    0
9   952001   g  0.44    0
10  952001   h  0.77    0
12  652115   d  1.55    0
13  652115   s  2.55    0
14  652115   s  2.55    0

$`1`
        ID var value test
1  9442000   a  2.01    1
5  9442000   s  0.55    1
7   952001   d  0.22    1
11  652115   a  4.66    1