基于R数据帧中变量的随机选择

基于R数据帧中变量的随机选择,r,dataframe,R,Dataframe,我有一个1000列的数据框。这是一个不同品种动物的数据集。然而,我有更多的动物从一些品种。所以我想做的是从那些有更多动物的品种中随机抽取一个样本,让所有的品种都有相同数量的观察结果。 细节:我有400只荷斯坦动物,300只泽西,100只赫里福德,150只内洛和50只坎钦。我想做的是从每个品种中随机选择50只动物。所以最后我总共有250只动物。我知道如何使用runif随机选择,但是我不确定如何在我的案例中应用它。 我的数据如下所示: Breed ID Trait1 Trait2

我有一个1000列的数据框。这是一个不同品种动物的数据集。然而,我有更多的动物从一些品种。所以我想做的是从那些有更多动物的品种中随机抽取一个样本,让所有的品种都有相同数量的观察结果。 细节:我有400只荷斯坦动物,300只泽西,100只赫里福德,150只内洛和50只坎钦。我想做的是从每个品种中随机选择50只动物。所以最后我总共有250只动物。我知道如何使用runif随机选择,但是我不确定如何在我的案例中应用它。 我的数据如下所示:

Breed   ID    Trait1    Trait2  Trait3
Holstein    1       11     22     44
Jersey      2       22     33     55
Nelore      3       33     44     66
Nelore      4       44     55     77
Canchim     5       55     66     88
我试过:

Data = data[!!ave(seq_along(data$Breed), unique(data$Breed), FUN=function(x) sample(x, 50) == x),]
但是,它不起作用,我不允许在我使用的服务器上安装包dplyr。
提前感谢。

您可以
在品种上拆分您的动物数据框,然后对每个区块应用自定义函数,该函数将随机抽取50行:

animals.split <- split(animals, animals$Breed)
animals.list <- lapply(animals.split, function(x) {
                   y <- x[sample(nrow(x), 50), ]
                   return(y)
                }
result <- unsplit(animals.list, f = animals$Breed)

animals.split您可以
split
按品种分割您的数据,即
split(dat,dat$品种)
,这应该会给出一个data.frames列表。因此,
lappy
将一个采样过程绑定到该列表并重新绑定在一起,
do.call(rbind,lappy(split(dat,dat$bride),function(x)x[sample(nrow(x),50),])
。没有测试,但希望能工作我只是想到了一种更复杂的方法,不需要分割数据。您可以按品种订购,
dat这基本上与这里相同:-例如
iris[unlist(tapply(1:nrow(iris),iris$物种,样本,大小=2)),]
@latemail nice one,我想它只是
lapply的包装(split
方法。我将开始更多地使用它。@bunk-基本上,是的。如果您可以避免使用大型对象,并处理然后应用于大型对象的索引一次,您将得到高效的代码。谢谢Tim。我这样做时遇到一个错误。
行中的错误。请尝试使用
unsplit
。I我现在正在打手机。