分组排名变量(dplyr)
我有一个包含列分组排名变量(dplyr),r,dplyr,R,Dplyr,我有一个包含列x1、x2、group的数据框,我想生成一个新的数据框,其中包含一个额外的列rank,该列指示x1在其组中的顺序 有一个相关的问题,但公认的答案似乎不再有效 在这里之前,一切都很好: library(dplyr) data(iris) by_species <- iris %>% arrange(Species, Sepal.Length) %>% group_by(Species) 卸载plyr它
x1、x2、group
的数据框,我想生成一个新的数据框,其中包含一个额外的列rank
,该列指示x1
在其组中的顺序
有一个相关的问题,但公认的答案似乎不再有效
在这里之前,一切都很好:
library(dplyr)
data(iris)
by_species <- iris %>%
arrange(Species, Sepal.Length) %>%
group_by(Species)
卸载plyr
它可以正常工作:
detach("package:plyr", unload=TRUE)
by_species <- iris %>%
arrange(Species, Sepal.Length) %>%
group_by(Species) %>%
mutate(rank=row_number())
by_species %>% filter(rank <= 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species rank
## (dbl) (dbl) (dbl) (dbl) (fctr) (int)
## 1 4.3 3.0 1.1 0.1 setosa 1
## 2 4.4 2.9 1.4 0.2 setosa 2
## 3 4.4 3.0 1.3 0.2 setosa 3
## 4 4.9 2.4 3.3 1.0 versicolor 1
## 5 5.0 2.0 3.5 1.0 versicolor 2
## 6 5.0 2.3 3.3 1.0 versicolor 3
## 7 4.9 2.5 4.5 1.7 virginica 1
## 8 5.6 2.8 4.9 2.0 virginica 2
## 9 5.7 2.5 5.0 2.0 virginica 3
detach(“包:plyr”,unload=TRUE)
按物种%
排列(种,萼片长度)%>%
组别(种类)%>%
变异(秩=行数()
通过_species%>%过滤器(秩以下产生指定的期望结果
library(dplyr)
by_species <- iris %>% arrange(Species, Sepal.Length) %>%
group_by(Species) %>%
mutate(rank = rank(Sepal.Length, ties.method = "first"))
by_species %>% filter(rank <= 3)
##Source: local data frame [9 x 6]
##Groups: Species [3]
##
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species rank
## (dbl) (dbl) (dbl) (dbl) (fctr) (int)
##1 4.3 3.0 1.1 0.1 setosa 1
##2 4.4 2.9 1.4 0.2 setosa 2
##3 4.4 3.0 1.3 0.2 setosa 3
##4 4.9 2.4 3.3 1.0 versicolor 1
##5 5.0 2.0 3.5 1.0 versicolor 2
##6 5.0 2.3 3.3 1.0 versicolor 3
##7 4.9 2.5 4.5 1.7 virginica 1
##8 5.6 2.8 4.9 2.0 virginica 2
##9 5.7 2.5 5.0 2.0 virginica 3
by_species %>% slice(1:3)
##Source: local data frame [9 x 6]
##Groups: Species [3]
##
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species rank
## (dbl) (dbl) (dbl) (dbl) (fctr) (int)
##1 4.3 3.0 1.1 0.1 setosa 1
##2 4.4 2.9 1.4 0.2 setosa 2
##3 4.4 3.0 1.3 0.2 setosa 3
##4 4.9 2.4 3.3 1.0 versicolor 1
##5 5.0 2.0 3.5 1.0 versicolor 2
##6 5.0 2.3 3.3 1.0 versicolor 3
##7 4.9 2.5 4.5 1.7 virginica 1
##8 5.6 2.8 4.9 2.0 virginica 2
##9 5.7 2.5 5.0 2.0 virginica 3
库(dplyr)
按种%排列(种,萼片长度)%>%
组别(种类)%>%
变异(秩=秩(萼片.长度,系带.方法=“第一”))
按物种%>%筛选(排名百分比切片(1:3)
##来源:本地数据帧[9 x 6]
##类群:种[3]
##
##萼片。长萼片。宽花瓣。长花瓣。宽种级
##(dbl)(dbl)(dbl)(dbl)(fctr)(int)
##1 4.3 3.0 1.1 0.1 setosa 1
##2 4.4 2.9 1.4 0.2刚毛2
##3 4.4 3.0 1.3 0.2 3
##4.9 2.4 3.3 1.0版本1
##5.0 2.0 3.5 1.0版本2
##6.5.0 2.3 3.3 1.0版本3
##7 4.9 2.5 4.5 1.7弗吉尼亚州1
##8 5.6 2.8 4.9 2.0弗吉尼亚州2
##9 5.7 2.5 5.0 2.0弗吉尼亚州3
对于未来的读者,可以使用基数R实现按组排序变量。根据OP的iris
数据示例,根据萼片长度进行排序
:
# ORDER BY SPECIES AND SEPAL.LENGTH
iris <- iris[with(iris, order(Species, Sepal.Length)), ]
# RUN A ROW COUNT FOR RANK BY SPECIES GROUP
iris$rank <- sapply(1:nrow(iris),
function(i) sum(iris[1:i, c('Species')]==iris$Species[i]))
# FILTER DATA FRAME BY TOP 3
iris <- iris[iris$rank <= 3,]
#按种和萼片长度排序
iris你确定命令by_species嗯不,我不确定…:当我使用rank
:by_species@steveb加载plyr
然后dplyr
它似乎在我的计算机中不起作用我还发现我需要使用分离(“package:plyr”,unload=TRUE)
让我的正确运行。这个问题需要一个dplyr
解决方案,所以我在这篇评论中放了一个data.table
解决方案,因为它可能有用。下面将使用data.table
:setDT(鸢尾)[order(Species,Sepal.Length),.SD[1:3],by=Species]
library(dplyr)
by_species <- iris %>% arrange(Species, Sepal.Length) %>%
group_by(Species) %>%
mutate(rank = rank(Sepal.Length, ties.method = "first"))
by_species %>% filter(rank <= 3)
##Source: local data frame [9 x 6]
##Groups: Species [3]
##
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species rank
## (dbl) (dbl) (dbl) (dbl) (fctr) (int)
##1 4.3 3.0 1.1 0.1 setosa 1
##2 4.4 2.9 1.4 0.2 setosa 2
##3 4.4 3.0 1.3 0.2 setosa 3
##4 4.9 2.4 3.3 1.0 versicolor 1
##5 5.0 2.0 3.5 1.0 versicolor 2
##6 5.0 2.3 3.3 1.0 versicolor 3
##7 4.9 2.5 4.5 1.7 virginica 1
##8 5.6 2.8 4.9 2.0 virginica 2
##9 5.7 2.5 5.0 2.0 virginica 3
by_species %>% slice(1:3)
##Source: local data frame [9 x 6]
##Groups: Species [3]
##
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species rank
## (dbl) (dbl) (dbl) (dbl) (fctr) (int)
##1 4.3 3.0 1.1 0.1 setosa 1
##2 4.4 2.9 1.4 0.2 setosa 2
##3 4.4 3.0 1.3 0.2 setosa 3
##4 4.9 2.4 3.3 1.0 versicolor 1
##5 5.0 2.0 3.5 1.0 versicolor 2
##6 5.0 2.3 3.3 1.0 versicolor 3
##7 4.9 2.5 4.5 1.7 virginica 1
##8 5.6 2.8 4.9 2.0 virginica 2
##9 5.7 2.5 5.0 2.0 virginica 3
# ORDER BY SPECIES AND SEPAL.LENGTH
iris <- iris[with(iris, order(Species, Sepal.Length)), ]
# RUN A ROW COUNT FOR RANK BY SPECIES GROUP
iris$rank <- sapply(1:nrow(iris),
function(i) sum(iris[1:i, c('Species')]==iris$Species[i]))
# FILTER DATA FRAME BY TOP 3
iris <- iris[iris$rank <= 3,]