用[]和$和R中的样本对数据帧进行子设置会导致行重复

时间:2018-12-06 10:00:55

标签: r subset sample

我计划使用sample函数随机子集一个data.frame。 我最初的方法是

data(mtcars)
mtcarsDF<-data.frame(mtcars,stringsAsFactors =F)
mtcarsDF$Name<-row.names(mtcarsDF)
mtcarsDF$Test<-F
mtcarsDF[sample(1:nrow(mtcarsDF), nrow(mtcarsDF)/3),]$Test<-T
table(mtcarsDF$Test)

Test==FTest==T的数量为2:1。看来是对的。但是,我发现data.frame mtcarsDF中的某些行是随机重复的。

sort(table(mtcarsDF$Name))

在原始数据集中,Toyota Corolla仅出现在一行中。 mtcarsDF[sample(1:nrow(mtcarsDF), nrow(mtcarsDF)/3),]$Test<-T之后,这些行被弄乱了。

    AMC Javelin  Cadillac Fleetwood          Camaro Z28          Datsun 710    Dodge Challenger 
              1                   1                   1                   1                   1 
       Fiat 128           Fiat X1-9        Lotus Europa       Mazda RX4 Wag           Merc 240D 
              1                   1                   1                   1                   1 
  Porsche 914-2       Toyota Corona             Valiant          Volvo 142E          Duster 360 
              1                   1                   1                   1                   2 
    Honda Civic      Hornet 4 Drive   Hornet Sportabout Lincoln Continental       Maserati Bora 
              2                   2                   2                   2                   2 
      Mazda RX4           Merc 280C      Toyota Corolla 
              2                   2                   2 

如果我先将样本索引保存在变量中 testIndex,然后执行相同的子集处理。我可以得到正确的结果。

mtcarsDF<-data.frame(mtcars,stringsAsFactors =F)
mtcarsDF$Name<-row.names(mtcarsDF)
mtcarsDF$Test<-F
testIndex<-sample(1:nrow(mtcarsDF), nrow(mtcarsDF)/3)
mtcarsDF[testIndex,]$Test<-T

结果:

        AMC Javelin  Cadillac Fleetwood          Camaro Z28   Chrysler Imperial          Datsun 710 
                  1                   1                   1                   1                   1 
   Dodge Challenger          Duster 360        Ferrari Dino            Fiat 128           Fiat X1-9 
                  1                   1                   1                   1                   1 
     Ford Pantera L         Honda Civic      Hornet 4 Drive   Hornet Sportabout Lincoln Continental 
                  1                   1                   1                   1                   1 
       Lotus Europa       Maserati Bora           Mazda RX4       Mazda RX4 Wag            Merc 230 
                  1                   1                   1                   1                   1 
          Merc 240D            Merc 280           Merc 280C          Merc 450SE          Merc 450SL 
                  1                   1                   1                   1                   1 
        Merc 450SLC    Pontiac Firebird       Porsche 914-2      Toyota Corolla       Toyota Corona 
                  1                   1                   1                   1                   1 
            Valiant          Volvo 142E 
                  1                   1 

我无法确切理解是什么导致了差异。我也尝试其他方法:

mtcarsDF<-data.frame(mtcars,stringsAsFactors =F)
mtcarsDF$Name<-row.names(mtcarsDF)
mtcarsDF$Test<-F
mtcarsDF[sample(1:nrow(mtcarsDF), nrow(mtcarsDF)/3),"Test"]<-T
sort(table(mtcarsDF$Name))

结果也是正确的。

        AMC Javelin  Cadillac Fleetwood          Camaro Z28   Chrysler Imperial          Datsun 710 
                  1                   1                   1                   1                   1 
   Dodge Challenger          Duster 360        Ferrari Dino            Fiat 128           Fiat X1-9 
                  1                   1                   1                   1                   1 
     Ford Pantera L         Honda Civic      Hornet 4 Drive   Hornet Sportabout Lincoln Continental 
                  1                   1                   1                   1                   1 
       Lotus Europa       Maserati Bora           Mazda RX4       Mazda RX4 Wag            Merc 230 
                  1                   1                   1                   1                   1 
          Merc 240D            Merc 280           Merc 280C          Merc 450SE          Merc 450SL 
                  1                   1                   1                   1                   1 
        Merc 450SLC    Pontiac Firebird       Porsche 914-2      Toyota Corolla       Toyota Corona 
                  1                   1                   1                   1                   1 
            Valiant          Volvo 142E 
                  1                   1 

我不确定为什么只有 sample()+ $方法会弄乱数据。如果有人可以分享原因,那就太好了。

非常感谢!

0 个答案:

没有答案