获取具有相同特征的data.frame的子集,并从每个子集中选择一行

use*_*015 1 random r

假设我在R中有一个矩阵,如下所示:

ID Value
1 10
2 5
2 8
3 15
4 7
4 9
...
Run Code Online (Sandbox Code Playgroud)

我需要的是一个随机样本,其中每个元素只表示一次.

这意味着将选择ID 1,将选择ID为2的两行之一,将选择ID 3,ID为4的两行之一,等等...

可以有两个以上的重复项.

我试图在没有子集和采样子集的情况下找出最常用的R-esque方法?

谢谢!

the*_*ail 5

tapply横跨rownames和抢sample1每个在ID组:

dat[tapply(rownames(dat),dat$ID,FUN=sample,1),]

#  ID Value
#1  1    10
#3  2     8
#4  3    15
#6  4     9
Run Code Online (Sandbox Code Playgroud)

如果你的数据真的是a matrix而不是a data.frame,你也可以解决这个问题:

dat[tapply(as.character(seq(nrow(dat))),dat$ID,FUN=sample,1),]
Run Code Online (Sandbox Code Playgroud)

不要试图删除as.character,因为sample当只有一个值传递给它时会产生意想不到的结果.例如

replicate(10, sample(4,1) )
#[1] 1 1 4 2 1 2 2 2 3 4
Run Code Online (Sandbox Code Playgroud)