我不知道为什么代码不起作用
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(.))
答案 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