【问题标题】:Weird behavior in dplyr slice for RR 的 dplyr 切片中的奇怪行为
【发布时间】:2015-05-27 19:42:49
【问题描述】:

在 R 的 dplyr 包中调用 slice(df, i) 时,如果我要求的行索引不存在 (nrows < i),它似乎会返回除组中的第一行之外的所有行,就像我调用的那样slice(df, -1).

例如:

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() 然后在组上调用slice() 时,这尤其令人讨厌。 slice() 这样做有合理的原因吗?

看起来返回填充了 NA 的行索引大于 'nrows' 在组中“不够高”以产生请求的切片可能是一个有用的结果。

这是因为我试图从每个组中提取排名结果,但有些组没有足够的数据,而另一些组则有。例如“列出每个地区销售额排名第 10 的销售人员。”但其中一个地区只有 8 名销售人员。

【问题讨论】:

  • 请在您的帖子中添加一个可重现的示例。
  • 更多关于如何给minimal reproducible example的信息。
  • 感谢您的提示。
  • 类似的问题也适用于slice(df,0),它应该返回一个“空”的data.frame,就像df[0,] 一样。
  • 哦,试试slice(df,NA_integer_) 让 R 崩溃。

标签: r dplyr


【解决方案1】:

我参加这个聚会有点晚了,但我来了。错误消息“错误:不兼容的类型,需要字符向量”有一个非常简单的解决方案

只需在 mutate() 函数之前插入 ungroup() 就可以了。

但我认为这是slice() 中的某种错误。我将提交错误报告。

【讨论】:

  • 有人报告过这个错误吗?如果是这样,你可以链接它吗? 3年多过去了,问题似乎仍然存在......
【解决方案2】:

我同意:这种行为似乎不对。您可以使用以下替代方法:

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

【讨论】:

  • 谢谢,马特。我喜欢它——回到filter 并重新创建slice 应该做的事情!
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2020-03-27
  • 2015-06-26
  • 1970-01-01
  • 2020-08-02
相关资源
最近更新 更多