Một nhiệm vụ phổ biến trong thao tác dữ liệu trong R là tập hợp một khung dữ liệu bằng cách xóa các hàng phù hợp với một tiêu chí nhất định. Tuy nhiên, cách đơn giản để thực hiện điều này trong R dường như không phù hợp về mặt logic và thậm chí nguy hiểm đối với những người chưa từng trải nghiệm (như bản thân tôi).Cách đơn giản để xóa các dòng dữ liệu phù hợp với các trường hợp không có hàng nào phù hợp với tiêu chí xóa
phép nói rằng chúng tôi có một khung dữ liệu và chúng tôi muốn loại trừ hàng thuộc về việc điều trị "G1":
Treatment=c("G1","G1","G1","G1","G1","G1","G2","G2","G2","G2","G2",
"G2","G3","G3","G3","G3","G3","G3")
Vals=c(runif(6),runif(6)+0.9,runif(6)-0.3)
data=data.frame(Treatment)
data=cbind(data, Vals)
Đúng như dự đoán, các mã dưới đây loại bỏ các hàng dataframe phù hợp với tiêu chí của người đầu tiên dòng
to_del=which(data$Treatment=="G1")
new_data=data[-to_del,]
new_data
Tuy nhiên, trái với mong đợi, sử dụng phương pháp này nếu 'mà' lệnh không tìm thấy bất kỳ hàng phù hợp với mã này loại bỏ tất cả các hàng thay vì để tất cả chúng mình
to_del=which(data$Treatment=="G4")
new_data=data[-to_del,]
new_data
Đoạn mã trên dẫn đến khung dữ liệu không có hàng, không có ý nghĩa (tức là, vì R không tìm thấy hàng phù hợp với tiêu chí xóa của tôi, nó đã xóa tất cả các hàng). công việc xung quanh tôi không được công việc nhưng tôi sẽ tưởng tượng có một cách đơn giản hơn để làm điều này mà không cần tất cả các báo cáo có điều kiện
###WORKAROUND
to_del=which(data$Treatment=="G4") #no G4 treatment in this particular data frame
if (length(to_del)>0){
new_data=data[-to_del,]
}else{
new_data=data
}
new_data
Có ai có một cách đơn giản để làm điều này mà làm việc ngay cả khi không có hàng phù hợp với tiêu chuẩn quy định ?
+1: bị ấn tượng bởi những nỗ lực xung quanh công việc khéo léo. – Simon
Cảm ơn các câu trả lời đơn giản và nhanh chóng. Cả hai cách tiếp cận do Joshua và Ricardo đề xuất đều hoạt động tốt: new_data = data [data $ Treatment! = "G4",] new_data = data [! Data $ Treatment == "G4",] –