Подстановка фрейма данных с [] и $ и выборка в R приводят к дублированию строки - PullRequest
0 голосов
/ 06 декабря 2018

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

Большое спасибо!

...