R 删除具有特定值的一组变量中观察值的随机子集

R 删除具有特定值的一组变量中观察值的随机子集,r,R,让我们假设我有一个数据框,在这个数据框中,我想删除满足某个标准的随机观察样本(意思是整行)。以这个数据帧为例: id var1 var2 AAAA 1 Car BBBB 2 Truck CCCC 1 Boat DDDD 2 Car EEEE 1 Truck FFFF 2 Car FFFF 2 Car FFFF 2 Car FFFF 2 Car (1)在var2==“Car”的位置随机抽取(n=3)

让我们假设我有一个数据框,在这个数据框中,我想删除满足某个标准的随机观察样本(意思是整行)。以这个数据帧为例:

id    var1  var2
AAAA  1     Car
BBBB  2     Truck
CCCC  1     Boat
DDDD  2     Car
EEEE  1     Truck
FFFF  2     Car
FFFF  2     Car
FFFF  2     Car
FFFF  2     Car

(1)在
var2==“Car”
的位置随机抽取(n=3)个观察值,以及(2)删除
var2==“Car”
的所有其他行,这些行没有被取样,我们该怎么做?在某个标准(即“var2=Car”)内使用
sample()
时遇到问题,因为它还从数据集中删除了所有其他观察值(当我想用
Trucks
Boats
保留其他行时)

(carindex这里是一种使用
数据的方法。table
.I
是一个包含特定子集行号的向量。(请参见
?data.table

库(data.table)
#假设您的data.frame名为df

DT关于您在使用
sample
时遇到的困难,可能与您的采样来源有关

您不希望直接从data.frame中采样,因为这样会对列进行采样

您不希望从逻辑向量中采样,因为使用结果进一步索引data.frame并不简单

相反,您希望从索引到行进行采样。您可以从适当的索引子集进行采样,然后与第二个子集合并,但这很麻烦

更直接的方法是对您将要取出的内容进行采样:
在哪里,
DT sample()命令会有帮助吗?我发现一个棘手的部分是,在某个标准(即“var2=Car”)内进行采样也会从数据集中删除所有其他观察值——我想用
卡车
船只
保留其他行。
(carindex <- which(dat$var2 == 'Car'))
(deleteindex <- sample(carindex, length(carindex) - 3)) 
dat[-deleteindex, ]

R > (carindex <- which(dat$var2 == 'Car'))
[1] 1 4 6 7 8 9
R > (deleteindex <- sample(carindex, length(carindex) - 3))
[1] 4 6 9
R > dat[-deleteindex, ]
    id var1  var2
1 AAAA    1   Car
2 BBBB    2 Truck
3 CCCC    1  Boat
5 EEEE    1 Truck
7 FFFF    2   Car
8 FFFF    2   Car
library(data.table)
# assuming your data.frame is called df
DT <- data.table(df)

DT[DT[, list(keep =  if(var2 =='Car'){
   .I[sample(.N, 3)]
   } else{.I})  ,  by = var2]$keep]

     id var1  var2
1: DDDD    2   Car
2: FFFF    2   Car
3: AAAA    1   Car
4: BBBB    2 Truck
5: EEEE    1 Truck
6: CCCC    1  Boat
# remove 3 random rows where var2 is "car": 
DT[-sample(which(var2=="Car"), 3)]

#      id var1  var2
# 1: BBBB    2 Truck
# 2: CCCC    1  Boat
# 3: DDDD    2   Car
# 4: EEEE    1 Truck
# 5: FFFF    2   Car
# 6: FFFF    2   Car