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)随机抽样(n = 3)的观察var2=="Car",以及(2)删除所有其他var2=="Car"未抽样的行?我sample()在某个标准(即“var2 = Car”)内使用时遇到问题,因为它还会从数据集中删除所有其他观察结果(当我想用Trucksand保留其他行时Boats

4

3 回答 3

4

关于您在使用时遇到的困难sample,它可能与您采样的对象/地点有关。

您不想直接从 data.frame 中采样,因为这将对列进行采样

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

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

更直接的是对您将取出的内容进行采样

# 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

在哪里DT <- data.table(yourDataFrame)

请注意使用 为which( )行提供索引。如果没有,我会从TRUE&的向量中采样FALSE(多亏了这recycling会产生非常不可预测的结果)。

于 2013-04-23T03:42:59.130 回答
3
(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
于 2013-04-23T02:38:13.203 回答
1

这是一种使用data.table. .I是包含特定子集的行号的向量。(见?data.table

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
于 2013-04-23T02:38:17.800 回答