R 基于第二列顺序的列密集排序
我正在绞尽脑汁做一些可能是直截了当的事情。我希望在数据帧中的一列上获得“密集”排名(如函数所定义),但不是基于列的正确顺序,顺序应该由另一列给出(R 基于第二列顺序的列密集排序,r,dplyr,R,Dplyr,我正在绞尽脑汁做一些可能是直截了当的事情。我希望在数据帧中的一列上获得“密集”排名(如函数所定义),但不是基于列的正确顺序,顺序应该由另一列给出(val,在我的示例中) 我设法获得了密集的排名,如下所示: 库(dplyr) foo_df%arrange(val)%%>%mutate(id_fac=as.integer(factor(id))) #>id val id_fac #>1 4 a 3 #>2 1 b 1 #>3 1 c 1 #>43D2 #>5 3 e 2 但我希望根据val对系数级
val
,在我的示例中)
我设法获得了密集的排名,如下所示:
库(dplyr)
foo_df%arrange(val)%%>%mutate(id_fac=as.integer(factor(id)))
#>id val id_fac
#>1 4 a 3
#>2 1 b 1
#>3 1 c 1
#>43D2
#>5 3 e 2
但我希望根据val
对系数级别进行排序。期望输出:
foo_所需的%arrange(val)%%>%mutate(id_fac=as.integer(factor(id,levels=c(4,1,3)))
福乌
#>id val id_fac
#>1 4 a 1
#>2 1 b 2
#>3 1 c 2
#>43D3
#>5 3 e 3
- 我尝试了
data.table::frank
- 我通过@Prasad Chalasani尝试了这两种方法
- 我尝试使用
(和id[rank(val)]
,以及sort(val)
)设置order(val)
id的顺序
- 最后,我还尝试使用
等对级别进行排序,但这会引发一个错误(rank(val)
)评估错误:因子级别[3]重复。
- 我知道可以指定级别顺序,我使用它来创建所需的输出。然而,这个解决方案并不好,因为我的数据有更多的行和级别
由(v0.2.1)于2018-12-19创建。您可以先使用
进行检查
foo_df %>% arrange(val) %>%
group_by(id)%>%mutate(id_fac = first(val))%>%
ungroup()%>%
mutate(id_fac=as.integer(factor(id_fac)))
# A tibble: 5 x 3
id val id_fac
<dbl> <fctr> <int>
1 4 a 1
2 1 b 2
3 1 c 2
4 3 d 3
5 3 e 3
foo_df%%>%arrange(val)%%>%
分组依据(id)%>%突变(id fac=first(val))%>%
解组()%>%
变异(id_fac=as.integer(factor(id_fac)))
#一个tibble:5x3
id val id_fac
1 4 a 1
2 1 b 2
3 1 c 2
43D3
5 3 e 3
您可以先查看
foo_df %>% arrange(val) %>%
group_by(id)%>%mutate(id_fac = first(val))%>%
ungroup()%>%
mutate(id_fac=as.integer(factor(id_fac)))
# A tibble: 5 x 3
id val id_fac
<dbl> <fctr> <int>
1 4 a 1
2 1 b 2
3 1 c 2
4 3 d 3
5 3 e 3
foo_df%%>%arrange(val)%%>%
分组依据(id)%>%突变(id fac=first(val))%>%
解组()%>%
变异(id_fac=as.integer(factor(id_fac)))
#一个tibble:5x3
id val id_fac
1 4 a 1
2 1 b 2
3 1 c 2
43D3
5 3 e 3
为什么你甚至需要因子?不确定我是否遗漏了什么,但这会提供您想要的输出
您可以使用match
根据id
s的出现来获取id\u fac
library(dplyr)
foo_df %>%
mutate(id_fac = match(id, unique(id)))
# id val id_fac
#1 4 a 1
#2 1 b 2
#3 1 c 2
#4 3 d 3
#5 3 e 3
为什么您甚至需要因子
?不确定我是否遗漏了什么,但这会提供您想要的输出
您可以使用match
根据id
s的出现来获取id\u fac
library(dplyr)
foo_df %>%
mutate(id_fac = match(id, unique(id)))
# id val id_fac
#1 4 a 1
#2 1 b 2
#3 1 c 2
#4 3 d 3
#5 3 e 3
这是一个很好的方法。然而,我会接受@Ronak Shah更直接的回答。这是一个很好的方法。不过,我会接受@Ronak Shah更直接的回答。你完全正确,我不需要任何因素——这只是我获得如此密集排名的方法。非常好的解决方案。谢谢你是绝对正确的,我不需要因素-这只是我的方法得到这个密集的排名。非常好的解决方案。谢谢