2015-05-27 38 views
6

當在R的dplyr包中調用slice(df, i)時,如果我索要的行索引不存在(nrows < i),它似乎會返回除組中第一個組的所有行,如我曾打電話給slice(df, -1)dplyr slice中的奇怪行爲R

例如:

library(dplyr) 

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

slice(df,2) 

結果將如預期那樣:

b 2 

但如果我叫

slice(df, 5) 

結果是每一行第一排:

b 2 
c 3 

這對使用group_by()和THEN調用slice()的組尤其令人厭煩。 slice()這樣做是否有合乎邏輯的原因?

看起來好像返回的行中填充了NAs,對於行數大於'nrows'的行不夠「高」來產生請求的分片可能是一個有用的結果。

這是因爲我試圖提取每個組的排名結果,但有些組沒有足夠的數據,而其他組卻沒有。例如「列出每個地區銷售額第十位的銷售人員。」但在其中一個地區只有8名銷售人員。

+3

請在您的文章中添加一個可重現的示例。 –

+1

有關如何給出[最小可重現示例]的更多信息(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610)。 – Jaap

+0

感謝您的提示。 – huff

回答

0

我同意:這種行爲似乎不對。你可以使用以下作爲替代:

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

謝謝,馬特。我喜歡它 - 回到'過濾器'並重新創造'切片'應該做些什麼聰明才智! – huff

1

我對這次派對遲到了,但這裏。有一個非常簡單的解決方案,錯誤消息「錯誤:不兼容的類型,期待一個字符向量」

只需在您的mutate()功能之前插入ungroup(),你應該沒問題。

但我認爲它的某種類型的錯誤slice()。我將提交一份錯誤報告。