我正在尽全力寻找可能直接解决的问题。我想在数据帧中的列上获得“密集”排名(为data.table::frank
函数定义),但不是基于列的正确顺序,该顺序应由另一列({ 1}}(在我的示例中)
我设法通过@Prasad Chalasani 's solution获得了密集排名,就像这样:
val
但是我希望根据library(dplyr)
foo_df <- data.frame(id = c(4,1,1,3,3), val = letters[1:5])
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
#> 4 3 d 2
#> 5 3 e 2
来排序因子水平。所需的输出:
val
foo_desired <- foo_df %>% arrange(val) %>% mutate(id_fac = as.integer(factor(id, levels = c(4,1,3))))
foo_desired
#> id val id_fac
#> 1 4 a 1
#> 2 1 b 2
#> 3 1 c 2
#> 4 3 d 3
#> 5 3 e 3
data.table::frank
(以及id
和id[rank(val)]
)来设置sort(val)
的顺序。最后,我还尝试使用order(val)
等对级别进行排序,但这会引发错误(rank(val)
)
我知道可以指定级别顺序,我用它来创建所需的输出。但是,此解决方案并不理想,因为我的数据具有更多的行和级别
为了方便起见,我需要这样做,以便生成具有特定顺序的表,而不是用于计算。
由reprex package(v0.2.1)于2018-12-19创建
答案 0 :(得分:3)
您可以使用first
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
答案 1 :(得分:2)
您为什么甚至需要factors
?不知道我是否想念什么,但这会提供您想要的输出。
您可以使用match
根据id_fac
的出现来获取id
。
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