Làm cách nào để xóa các hàng trong khung dữ liệu?


224

Tôi có một khung dữ liệu có tên là "mydata" trông như thế này:

   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 

Tôi muốn xóa hàng 2,4,6. Ví dụ, như thế này:

   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
Ngoài ra, bạn có thể muốn làm quen với một số thuật ngữ phổ biến để làm việc với dữ liệu. Điều này thường được gọi là tập hợp con, mà nếu bạn đã tìm kiếm trong "khung dữ liệu tập hợp con" của Google, bạn sẽ vào trang Câu hỏi thường gặp về UCLA R rất hữu ích . Chào mừng bạn đến với Stackoverflow!
A5C1D2H2I1M1N2O1R2T1

Đã thêm một số cách bổ sung cho việc sử dụng các vectơ boolean, ngoài câu trả lời tuyệt vời của @ mrdwab.
Paul Hiemstra

2
@ A5C1D2H2I1M1N2O1R2T1: Câu hỏi thường gặp về UCLA cho việc đặt lại R đã được di chuyển. Bây giờ nó ở đây .
Mike Sherrill 'Nhớ lại mèo'

Câu trả lời:


340

Ý tưởng chính là bạn tạo thành một tập hợp các hàng bạn muốn loại bỏ và giữ phần bổ sung của tập hợp đó.

Trong R, phần bù của một tập hợp được đưa ra bởi toán tử '-'.

Vì vậy, giả sử data.frameđược gọi là myData:

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

Tất nhiên, đừng quên "gán lại" myDatanếu bạn muốn bỏ hoàn toàn các hàng đó --- nếu không, R chỉ in kết quả.

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

59
Đừng quên ghi chú ,trong đó! ;)
Steven Jeuris

5
Điều gì xảy ra nếu khung dữ liệu của bạn chỉ là một cột. Nó dường như bỏ toàn bộ cấu trúc và tạo ra một vectơ của các giá trị
road_to_quantdom

6
@road_to_quantdom, thêm một drop = FALSEtrong đó.
A5C1D2H2I1M1N2O1R2T1

4
"Trong R, phần bù của một tập hợp được đưa ra bởi toán tử '-'" -> Đây là một từ ngữ rất sai lệch. Các chỉ số tiêu cực được loại bỏ và đó là nó, không có khái niệm bổ sung. Nếu bạn làm việc với logic và thử sử dụng -nó sẽ không hoạt động, bởi vì toán tử bổ sung cho logic là !. Phần bù của c (2,4,6) trong các hàng sẽ là setdiff (c (2,4,6), 1: nrow (myData)), không phải là c (-2, -4, -6) , mặc dù cả hai sẽ mang lại cùng một hàng khi được sử dụng với [.
Asac

2
@Speldosa myData[-c(2, 4, 6),,drop=F],. Trong thực tế, tôi sẽ đề nghị bạn luôn luôn chèn ,drop=Fngay trước khi ]truy cập ma trận.
Aaron McDaid

82

Bạn cũng có thể làm việc với một vectơ boolean, còn gọi là logical:

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

Lưu ý rằng !toán tử hoạt động như một KHÔNG, tức là !TRUE == FALSE:

myData = myData[!row_to_keep,]

Điều này có vẻ hơi cồng kềnh so với câu trả lời của @ mrwab (+1 btw :)), nhưng một vectơ logic có thể được tạo khi đang bay, ví dụ: khi giá trị cột vượt quá một giá trị nhất định:

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

Bạn có thể chuyển đổi một vectơ boolean thành một vectơ chỉ mục:

row_to_keep = which(myData$A > 4)

Cuối cùng, một mẹo rất gọn gàng là bạn có thể sử dụng loại tập hợp con này không chỉ để trích xuất mà còn để gán:

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

trong đó cột Ađược gán NA(không phải là số) trong đó Avượt quá 4.


Nếu bạn muốn loại trừ chúng thì sao? Trong ví dụ số 3 của bạn, nếu bạn suy yếu
GabrielMontlahoma

61

Các vấn đề với việc xóa theo số hàng

Để phân tích nhanh và bẩn, bạn có thể xóa các hàng của data.frame theo số theo câu trả lời hàng đầu. I E,

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

Tuy nhiên, nếu bạn đang cố gắng viết một tập lệnh phân tích dữ liệu mạnh mẽ, bạn thường nên tránh xóa các hàng theo vị trí số. Điều này là do thứ tự của các hàng trong dữ liệu của bạn có thể thay đổi trong tương lai. Một nguyên tắc chung của bảng data.frame hoặc cơ sở dữ liệu là thứ tự của các hàng không nên quan trọng. Nếu thứ tự có vấn đề, điều này sẽ được mã hóa trong một biến thực tế trong data.frame.

Ví dụ: hãy tưởng tượng bạn đã nhập một tập dữ liệu và xóa các hàng theo vị trí số sau khi kiểm tra dữ liệu và xác định số hàng của các hàng mà bạn muốn xóa. Tuy nhiên, tại một số điểm sau đó, bạn đi vào dữ liệu thô và xem xét xung quanh và sắp xếp lại dữ liệu. Mã xóa hàng của bạn bây giờ sẽ xóa các hàng sai và tệ hơn nữa, bạn không có khả năng nhận được bất kỳ lỗi nào cảnh báo bạn rằng điều này đã xảy ra.

Chiến lược tốt hơn

Một chiến lược tốt hơn là xóa các hàng dựa trên các thuộc tính thực chất và ổn định của hàng. Ví dụ: nếu bạn có một idbiến cột xác định duy nhất từng trường hợp, bạn có thể sử dụng biến đó.

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

Vào những lúc khác, bạn sẽ có một tiêu chí loại trừ chính thức có thể được chỉ định và bạn có thể sử dụng một trong nhiều công cụ đặt lại trong R để loại trừ các trường hợp dựa trên quy tắc đó.


11

Tạo cột id trong khung dữ liệu của bạn hoặc sử dụng bất kỳ tên cột nào để xác định hàng. Sử dụng chỉ mục là không công bằng để xóa.

Sử dụng subsetchức năng để tạo khung mới.

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

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

9

Theo trình tự đơn giản:

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

Theo trình tự:

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

Theo trình tự phủ định:

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

Hoặc nếu bạn muốn tập hợp con bằng cách chọn các số lẻ:

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

Hoặc nếu bạn muốn tập hợp con bằng cách chọn số lẻ, phiên bản 2:

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

Hoặc nếu bạn muốn tập hợp con bằng cách lọc các số chẵn:

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

Hoặc nếu bạn muốn tập hợp con bằng cách lọc các số chẵn, phiên bản 2:

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

5

Xóa Dan khỏi worker.data - Không cần quản lý dữ liệu mới.frame.

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

0

Đây là một chức năng nhanh và bẩn để loại bỏ một hàng theo chỉ mục.

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

Lỗ hổng chính của nó là đối số row_index không tuân theo mẫu R là một vectơ của các giá trị. Có thể có những vấn đề khác vì tôi chỉ dành vài phút để viết và kiểm tra nó, và chỉ mới bắt đầu sử dụng R trong vài tuần qua. Bất kỳ ý kiến ​​và cải tiến về điều này sẽ rất hoan nghênh!


0

Để hoàn thiện, tôi sẽ thêm rằng điều này cũng có thể được thực hiện dplyrbằng cách sử dụng slice. Ưu điểm của việc sử dụng này là nó có thể là một phần của quy trình công việc được xử lý.

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

Tất nhiên, bạn cũng có thể sử dụng nó mà không cần đường ống.

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

Định dạng "không phải vectơ", -c(2, 4, 6)có nghĩa là lấy mọi thứ không nằm ở hàng 2, 4 và 6. Ví dụ: sử dụng một phạm vi, giả sử bạn muốn xóa 5 hàng đầu tiên, bạn có thể làm slice(df, 6:n()). Để biết thêm ví dụ, xem các tài liệu .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.