Veri çerçevesindeki satırları nasıl silerim?


225

Ben böyle görünüyor "veri" adlı bir veri çerçevesi var:

   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 

2,4,6 satırını silmek istiyorum. Örneğin, şöyle:

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

12
Ayrıca, verilerle çalışmak için bazı yaygın terminolojilere aşina olmak isteyebilirsiniz. Bu genellikle alt kümeleme olarak adlandırılır; Google'da "r alt küme veri çerçevesi" için arama yaparsanız çok yararlı UCLA R SSS sayfasına gidersiniz . Bu arada Stackoverflow'a hoş geldiniz!
A5C1D2H2I1M1N2O1R2T1

@ Mrdwab'ın mükemmel cevabına ek olarak, boolean vektörleri kullanarak bazı alt kümeleme yöntemleri eklendi.
Paul Hiemstra

2
@ A5C1D2H2I1M1N2O1R2T1: R alt ayarı için UCLA SSS taşındı. Şimdi burada .
Mike Sherrill 'Cat Recall'

Yanıtlar:


341

Ana fikir, kaldırmak istediğiniz satır kümesini oluşturmanız ve bu kümenin tamamlayıcısını tutmanızdır.

R de, bir kümenin tamamlayıcısı '-' operatörü tarafından verilir.

Yani, varsayalım data.framedenir myData:

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

Tabii ki, myDatabu satırları tamamen bırakmak istiyorsanız "yeniden atamayı" unutmayın - aksi takdirde, R yalnızca sonuçları yazdırır.

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

59
,Orada not etmeyi unutmayın ! ;)
Steven Jeuris

5
veri çerçeveniz yalnızca bir sütunsa ne olur? Tüm yapıyı
düşürüyor

6
@ road_to_quantdom, buraya bir ekleyin drop = FALSE.
A5C1D2H2I1M1N2O1R2T1

4
"R'de, bir setin tamamlayıcısı '-' operatörü tarafından verilir" -> Bu çok yanıltıcı bir ifadedir. Negatif indeksler kaldırılır ve hepsi bu kadar, tamamlayıcı bir kavram yoktur. Mantıksal olarak çalışırsanız ve kullanmayı denerseniz, mantıksal -tamamlayıcı operatörü olduğu için çalışmaz !. Satırlardaki c (2,4,6) tamamlayıcısı, c (-2, -4, -6) olmayan setdiff (c (2,4,6), 1: nrow (myData)) olur. , her ikisiyle birlikte kullanıldığında aynı satırları verir [.
asac

2
@Speldosa myData[-c(2, 4, 6),,drop=F],. Aslında, her zaman herhangi bir matris erişiminden ,drop=Fhemen önce eklemenizi öneririm ].
Aaron McDaid

82

Ayrıca boolean vektörü olarak da çalışabilirsiniz logical:

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

Not o !operatörün DEĞİL, yani görevi görür !TRUE == FALSE:

myData = myData[!row_to_keep,]

Bu, @ mrwab'ın cevabı (+1 btw :)) ile karşılaştırıldığında biraz hantal görünüyor, ancak anında bir mantıksal vektör oluşturulabilir, örneğin bir sütun değerinin belirli bir değeri aştığı durumlarda:

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

Bir boole vektörünü bir indeks vektörüne dönüştürebilirsiniz:

row_to_keep = which(myData$A > 4)

Son olarak, çok düzgün bir hile, bu tür alt kümeleri sadece çıkarma için değil, aynı zamanda atama için de kullanabilmenizdir:

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

burada sütun 4'ten büyükse (sayı değil) Aatanır .NAA


Ya onları hariç tutmak istiyorsanız? Örnek numaranızda 3,
azalırsanız

61

Satır numarasına göre silinmeyle ilgili sorunlar

Hızlı ve kirli analizler için bir data.frame satırını en üstteki cevaba göre numaraya göre silebilirsiniz. yani,

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

Ancak, sağlam bir veri analizi komut dosyası yazmaya çalışıyorsanız, genellikle satırları sayısal konuma göre silmekten kaçınmalısınız. Bunun nedeni, verilerinizdeki satırların sırasının gelecekte değişebilmesidir. Bir data.frame veya veritabanı tablosunun genel prensibi, satırların sırasının önemli olmamasıdır. Sipariş önemliyse, bunun data.frame içindeki gerçek bir değişkenle kodlanması gerekir.

Örneğin, verileri inceledikten ve silmek istediğiniz satırların satır numaralarını belirledikten sonra bir veri kümesini içe aktardığınızı ve satırları sayısal konuma göre sildiğinizi düşünün. Bununla birlikte, daha sonraki bir noktada, ham verilere girersiniz ve etrafa bakıp verileri yeniden sıralarsınız. Satır silme kodunuz artık yanlış satırları silecek ve daha da kötüsü, bunun gerçekleştiğini belirten herhangi bir hata almanız olası değildir.

Daha iyi strateji

Daha iyi bir strateji, satırın esaslı ve kararlı özelliklerine dayalı satırları silmektir. Örneğin, idher vakayı benzersiz olarak tanımlayan bir sütun değişkeniniz varsa bunu kullanabilirsiniz.

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

Diğer zamanlarda, belirtilebilecek resmi bir hariç tutma ölçütleriniz olacaktır ve bu kurala göre vakaları hariç tutmak için R'deki birçok alt kümeleme aracından birini kullanabilirsiniz.


11

Veri çerçevenizde kimlik sütunu oluşturun veya satırı tanımlamak için herhangi bir sütun adı kullanın. Dizin kullanmak silmek adil değildir.

subsetYeni çerçeve oluşturmak için işlevi kullanın .

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

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

9

Basitleştirilmiş diziye göre:

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

Diziye göre:

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

Negatif sıralamaya göre:

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

Veya tek sayıları seçerek alt kümeyi ayarlamak istiyorsanız:

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

Veya tek sayıları seçerek alt kümeyi ayarlamak isterseniz, sürüm 2:

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

Veya çift sayıları filtreleyerek alt kümeye almak istiyorsanız:

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

Veya çift sayıları filtreleyerek alt kümeye almak istiyorsanız, sürüm 2:

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

5

Dan'ı çalışan.data'dan silin - Yeni bir veri çerçevesini yönetmeye gerek yoktur.

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

0

İşte bir satırı dizine göre kaldırmak için hızlı ve kirli bir işlev.

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), ])
  }
}

Ana kusuru, row_index argümanının bir değerler vektörü olma R modelini izlememesidir. Yazmak ve test etmek için sadece birkaç dakika harcadığım ve son birkaç haftada sadece R kullanmaya başladığım için başka sorunlar olabilir. Bu konuda herhangi bir yorum ve iyileştirme çok hoş olurdu!


0

Bütünlüğü sağlamak için, ben bu ile yapılabilir ekleyeceğiz dplyryanı kullanarak slice. Bunu kullanmanın avantajı, borulu bir iş akışının bir parçası olabilmesidir.

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

Tabii ki, boru olmadan da kullanabilirsiniz.

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

"Vektör değil" biçimi, 2, 4 ve 6. satırlarda olmayan-c(2, 4, 6) her şeyi elde etmek anlamına gelir. Bir aralık kullanan bir örnek için, ilk 5 satırı kaldırmak istediğinizi varsayalım . Daha fazla örnek için dokümanlara bakın .slice(df, 6:n())

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.