Я планирую использовать функцию 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 () + $ подхода портит данные.Было бы замечательно, если бы кто-то мог объяснить причину этого.
Большое спасибо!