我计划使用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==F
和Test==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()+ $方法会弄乱数据。如果有人可以分享原因,那就太好了。
非常感谢!