我有这样的数据集
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
答案 0 :(得分:3)
我认为你想要一个随机的sample
而我原来的ave
方法因为段太短而熄火,所以我转向tapply
和unlist
- 结果
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