【问题标题】:Deleting random subset of observations within a group of variables that have a certain value删除一组具有特定值的变量中的随机观察子集
【发布时间】:2013-04-23 02:20:42
【问题描述】:

假设我有一个数据框,我想在其中删除满足特定标准的随机观察样本(即整行)。以这个数据框为例:

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() 时遇到问题,因为它还会从数据集中删除所有其他观察结果(当我想用TrucksBoats 保留其他行时)

【问题讨论】:

  • sample() 命令有帮助吗?
  • 我发现的棘手部分是在某个标准(即“var2=Car”)内的采样也会从数据集中删除所有其他观察结果——我想保留其他行TrucksBoats.

标签: r


【解决方案1】:

关于您在使用sample 时遇到的困难,它可能与您从什么/从哪里采样有关。

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

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

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

更直接的方法是对你要取出的东西进行抽样

# 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( ) 为行提供索引。如果没有,我会从TRUEFALSE 的向量中采样(感谢recycling,这会产生非常不可预测的结果)。

【讨论】:

    【解决方案2】:
    (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
    

    【讨论】:

      【解决方案3】:

      这是一种使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-16
        相关资源
        最近更新 更多