在dplyr中查找组的第二大数字

时间:2014-10-23 14:47:30

标签: r dplyr

我不知道为什么代码不起作用

  dd = function(x){
  t = which.max(x[,'Sepal.Length'])
  data = x[-t,]
  m= max(data[,'Sepal.Length'])
  return(m)
}

iris %>% group_by (Species) %>% do(dd(.))

4 个答案:

答案 0 :(得分:7)

您也可以使用slice

 library(dplyr)
 iris %>%
      group_by(Species) %>%
      distinct(Sepal.Length)%>% 
      arrange(desc(Sepal.Length)) %>% 
      slice(2) %>% 
      select(Sepal.Length)

 #        Species Sepal.Length
 #  1     setosa          5.7
 #  2 versicolor          6.9
 #  3  virginica          7.7

答案 1 :(得分:4)

这是summarise的方法:

myfun <-  function(x) {
  u <- unique(x)
  sort(u, decreasing = TRUE)[2L]
}

iris %>% 
  group_by(Species) %>% 
  summarise(result = myfun(Sepal.Length))

#      Species result
# 1     setosa    5.7
# 2 versicolor    6.9
# 3  virginica    7.7

答案 2 :(得分:2)

您还可以使用rank功能,该功能为您提供了多种处理重复值的选项。这是一个示例,它返回每个Sepal.Length中具有第二高值Species的所有行。

iris %>% 
  group_by(Species) %>%
  filter(rank(-Sepal.Length, ties.method="min")==2) 

  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1          7.7         3.8          6.7         2.2  virginica
2          7.7         2.6          6.9         2.3  virginica
3          7.7         2.8          6.7         2.0  virginica
4          7.7         3.0          6.1         2.3  virginica
5          6.9         3.1          4.9         1.5 versicolor
6          5.7         4.4          1.5         0.4     setosa
7          5.7         3.8          1.7         0.3     setosa

至于为什么你的代码不起作用:一个问题是它返回一个向量而不是data.frame。但是代码在它到达那一点之前就失败了。我真的不知道出了什么问题,但它与x[,"Sepal.Length"]x$Sepal.Length之间存在差异。希望其他人可以参与并准确解释问题所在。这是您的代码的更新版本:

dd = function(x){
  t = which.max(x$Sepal.Length)
  x = x[-t,]
  m = max(x$Sepal.Length)
  return(as.data.frame(m))
}

iris %>% group_by (Species) %>% do(dd(.))

     Species   m
1     setosa 5.7
2 versicolor 6.9
3  virginica 7.7

x[,"Sepal.Length"]更改为x$Sepal.Length可以解决您遇到的错误。但是,如果您还没有将m作为data.frame而不是向量返回,则会出现新的错误。

答案 3 :(得分:1)

这不起作用的原因是因为在对数据框进行分组后,您无法像预期的那样始终访问其列。当分组变量未包含在结果中时,它将引发错误。有关更详细的讨论,请参阅Indexing grouped_df object

例如,在您的情况下,iris[, "Sepal.Length"]有效,但如果您在分组数据框架上尝试此操作,则会失败。

group_by(iris, Species)[, "Sepal.Length"]
# Error: index out of bounds

原因是分组变量未包含在所选列中。如果您尝试group_by(iris, Species)[, c("Species", "Sepal.Length")],您会看到它有效。

解决方法是使用双括号或美元符号来返回向量而不是数据框,即group_by(iris, Species)[["Sepal.Length"]]group_by(iris, Species)$Sepal.Length

因此,如果按以下方式修改代码,则代码将起作用

dd = function(x){
  t = which.max(x$Sepal.Length)
  data = x[-t,]
  m= max(data$Sepal.Length)
  return(data.frame(m))
}

iris %>% group_by (Species) %>% do(dd(.))
#Source: local data frame [3 x 2]
#Groups: Species
#
#     Species   m
#1     setosa 5.7
#2 versicolor 6.9
#3  virginica 7.7