Hoe verwijder ik rijen in een dataframe?

Ik heb een dataframe met de naam ‘mijngegevens’ dat er als volgt uitziet:

   A  B  C   D 
1. 5  4  4   4 
2. 5  4  4   4 
3. 5  4  4   4 
4. 5  4  4   4 
5. 5  4  4   4 
6. 5  4  4   4 
7. 5  4  4   4 

Ik wil rij 2,4,6 verwijderen. Bijvoorbeeld als volgt:

   A  B  C   D
1. 5  4  4  4 
3. 5  4  4  4 
5. 5  4  4  4 
7. 5  4  4  4 

Antwoord 1, autoriteit 100%

Het belangrijkste idee is dat u een set vormt van de rijen die u wilt verwijderen en de aanvulling van die set behoudt.

In R wordt het complement van een verzameling gegeven door de operator ‘-‘.

Dus, ervan uitgaande dat het data.frame myData wordt genoemd:

myData[-c(2, 4, 6), ]   # notice the -

Vergeet natuurlijk niet om myData opnieuw toe te wijzen als je die rijen helemaal wilt laten vallen — anders drukt R gewoon de resultaten af.

myData <- myData[-c(2, 4, 6), ]

Antwoord 2, autoriteit 24%

Je kunt ook werken met een zogenaamde booleaanse vector, ook wel logical genoemd:

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

Merk op dat de operator ! fungeert als een NOT, d.w.z. !TRUE == FALSE:

myData = myData[!row_to_keep,]

Dit lijkt een beetje omslachtig in vergelijking met het antwoord van @mrwab (+1 btw :)), maar er kan direct een logische vector worden gegenereerd, b.v. waar een kolomwaarde een bepaalde waarde overschrijdt:

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

Je kunt een booleaanse vector transformeren naar een vector van indices:

row_to_keep = which(myData$A > 4)

Ten slotte is een heel handig trucje dat je dit soort subsettings niet alleen kunt gebruiken voor extractie, maar ook voor toewijzing:

myData$A[myData$A > 4,] <- NA

waarbij kolom A NA is toegewezen (geen nummer) waarbij A groter is dan 4.

Antwoord 3, autoriteit 18%

Problemen met verwijderen op rijnummer

Voor snelle en vuile analyses kunt u rijen van een data.frame op nummer verwijderen volgens het bovenste antwoord. D.w.z.

newdata <- myData[-c(2, 4, 6), ] 

Als u echter een robuust script voor gegevensanalyse probeert te schrijven, moet u over het algemeen voorkomen dat u rijen op numerieke positie verwijdert. Dit komt omdat de volgorde van de rijen in uw gegevens in de toekomst kan veranderen. Een algemeen principe van een data.frame of databasetabellen is dat de volgorde van de rijen er niet toe zou moeten doen. Als de volgorde van belang is, moet dit worden gecodeerd in een werkelijke variabele in het data.frame.

Stel je bijvoorbeeld voor dat je een gegevensset hebt geïmporteerd en rijen hebt verwijderd op numerieke positie nadat je de gegevens hebt geïnspecteerd en de rijnummers hebt geïdentificeerd van de rijen die je wilt verwijderen. Op een later moment ga je echter naar de onbewerkte gegevens en kijk je rond en herschik je de gegevens. Uw rijverwijderingscode verwijdert nu de verkeerde rijen, en erger nog, u krijgt waarschijnlijk geen fouten die u waarschuwen dat dit is gebeurd.

Betere strategie

Een betere strategie is om rijen te verwijderen op basis van inhoudelijke en stabiele eigenschappen van de rij. Als u bijvoorbeeld een kolomvariabele id had die elk geval op unieke wijze identificeert, kunt u die gebruiken.

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

Andere keren heb je formele uitsluitingscriteria die kunnen worden gespecificeerd, en kun je een van de vele subset-tools in R gebruiken om gevallen op basis van die regel uit te sluiten.

Antwoord 4, autoriteit 4%

Maak een ID-kolom in uw gegevensframe of gebruik een willekeurige kolomnaam om de rij te identificeren. Het gebruik van index is niet eerlijk om te verwijderen.

Gebruik de functie subset om een ​​nieuw frame te maken.

updated_myData <- subset(myData, id!= 6)
print (updated_myData)
updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)

Antwoord 5, autoriteit 3%

In vereenvoudigde volgorde:

mydata[-(1:3 * 2), ]

Op volgorde:

mydata[seq(1, nrow(mydata), by = 2) , ]

Op negatieve volgorde:

mydata[-seq(2, nrow(mydata), by = 2) , ]

Of als u een subset wilt door oneven nummers te selecteren:

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

Of als u een subset wilt door oneven nummers te selecteren, versie 2:

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

Of als u een subset wilt door even getallen eruit te filteren:

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

Of als u een subset wilt door even getallen eruit te filteren, versie 2:

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]

Antwoord 6, autoriteit 2%

Dan verwijderen uit employee.data – U hoeft geen nieuw data.frame te beheren.

employee.data <- subset(employee.data, name!="Dan")

Antwoord 7

Voor de volledigheid voeg ik eraan toe dat dit ook met dplyr kan worden gedaan met slice. Het voordeel hiervan is dat het onderdeel kan zijn van een doorgesluisde workflow.

df <- df %>%
  .
  .
  slice(-c(2, 4, 6)) %>%
  .
  .

Je kunt hem natuurlijk ook zonder leidingen gebruiken.

df <- slice(df, -c(2, 4, 6))

Het “niet vector” formaat, -c(2, 4, 6) betekent om alles te krijgen wat niet is in rijen 2, 4 en 6. Voor een Als u bijvoorbeeld een bereik gebruikt, laten we zeggen dat u de eerste 5 rijen wilt verwijderen, kunt u slice(df, 6:n()) doen. Zie de docs voor meer voorbeelden.

Antwoord 8

Hier is een snelle en vuile functie om een ​​rij op index te verwijderen.

removeRowByIndex <- function(x, row_index) {
  nr <- nrow(x)
  if (nr < row_index) {
    print('row_index exceeds number of rows')
  } else if (row_index == 1)
  {
    return(x[2:nr, ])
  } else if (row_index == nr) {
    return(x[1:(nr - 1), ])
  } else {
    return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
  }
}

Het grootste minpunt is dat het argument row_index niet het R-patroon volgt om een ​​vector van waarden te zijn. Er kunnen andere problemen zijn, aangezien ik maar een paar minuten heb besteed aan het schrijven en testen ervan en pas de afgelopen weken R ben gaan gebruiken. Eventuele opmerkingen en verbeteringen hierover zijn zeer welkom!

LEAVE A REPLY

Please enter your comment!
Please enter your name here

two × 2 =

Other episodes