2015-05-27 22 views
6

Khi gọi slice(df, i) trong gói dplyr cho R, nếu chỉ mục hàng tôi yêu cầu không tồn tại (nrows < i), nó xuất hiện để trả về tất cả các hàng nhưng nhóm đầu tiên, như Tôi đã gọi số slice(df, -1).Hành vi lạ trong lát dplyr cho R

Ví dụ:

library(dplyr) 

c1 <- c("a","b","c") 
c2 <- 1:3 
df <- data.frame(c1,c2) 

slice(df,2) 

Kết quả sẽ được như mong đợi:

b 2 

Nhưng nếu tôi gọi

slice(df, 5) 

kết quả là mỗi hàng nhưng hàng đầu tiên :

b 2 
c 3 

Điều này đặc biệt khó chịu khi sử dụng group_by() và THEN gọi slice() trên các nhóm. Có lý do hợp lý nào không vì sao slice() đang làm việc này?

Có vẻ như trả về (các) hàng chứa NA cho các chỉ mục hàng lớn hơn 'nrows' trong nhóm không đủ cao để tạo slice được yêu cầu có thể là kết quả hữu ích.

Điều này xuất hiện khi tôi đang cố gắng trích xuất kết quả được xếp hạng từ mỗi nhóm, nhưng một số nhóm không có đủ dữ liệu trong khi những nhóm khác lại làm. ví dụ. "Liệt kê nhân viên bán hàng có doanh thu cao nhất thứ 10 từ mỗi khu vực". Nhưng ở một trong những khu vực chỉ có 8 nhân viên bán hàng.

+3

Vui lòng thêm ví dụ có thể tái sản xuất vào bài đăng của bạn. –

+1

Thông tin thêm về cách cung cấp [ví dụ tái sản xuất tối thiểu] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610). – Jaap

+0

Cảm ơn lời khuyên. – huff

Trả lời

0

Tôi đồng ý: Hành vi này có vẻ không đúng. Bạn có thể sử dụng các mục sau đây làm phương án thay thế:

df <- data_frame(c1=c('a', 'a', 'b', 'c'), c2=c(1,2,3,4)) 

# c1 c2 
# 1 a 1 
# 2 a 2 
# 3 b 3 
# 4 c 4 

# get the second smallest row for each group, or the last row for 
# groups with less than 2 elements 
df %>% 
    group_by(c1) %>% 
    filter(row_number() == min(2, n())) 
# c1 c2 
# 1 a 2 
# 2 b 3 
# 3 c 4 
+0

Cảm ơn, Matt. Tôi thích nó - quay trở lại 'filter' và tái tạo lại những gì' slice' được cho là có liên quan đến sự khéo léo! – huff

1

Tôi sắp đến bữa tiệc này nhưng ở đây. Có một giải pháp thực sự đơn giản đối với thông báo lỗi "Lỗi: các loại không tương thích, mong đợi một vector ký tự"

chỉ cần chèn ungroup() trước khi chức năng mutate() của bạn và bạn sẽ không sao.

Nhưng tôi nghĩ đó là lỗi của một số loại trong số slice(). Tôi sẽ gửi báo cáo lỗi.