根据行名称有条件排列数据框,然后按列值排列

问题描述 投票:0回答:2

我正在根据性别数据构建一个表格,其中包含三个分类值和大量缺失数据。我将 NA 转换为“缺失”以创建第四个分类值。我想排列表格,以便将类别从最大到最小值排序,“缺失”类别始终位于底部。

但是,由于该表将从定期更新的数据集提供数据,因此基于其值的类别顺序可能会发生变化,并且我总是希望首先显示具有最大值的非缺失数据类别,然后显示缺失类别永远是最后一个。这使得使用

slice()
函数按索引号排列不可行。

下面的代码生成一个总结分类值的数据框,“Missing”位于顶部,因为它默认是最大的类别:

gender<-data.frame(peopledata$`Gender`)%>%
rename(`gender`=`peopledata.Gender`)%>%
mutate(`gender`= replace_na(`gender`,"Missing"))%>%    
table()%>%    
as.data.frame()%>%    
rename(`count`=`Freq`)%>%     
arrange(desc(`count`))

------------------------------------------------- --------------------------------------------------------------------------

输出:

性别
失踪了 293
28
14
未公开 1

------------------------------------------------- --------------------------------------------------------------------------

输入数据(为了简单起见,从性别数据中复制汇总表):

peopledata<-data.frame(gender = c("Missing", "Male", "Female", "Undisclosed, ), count= c(293, 28, 14, 1))

------------------------------------------------- --------------------------------------------------------------------------

我的问题集中在

arrange(desc(`count`))
行,以及如何更改它,使“失踪”行始终位于底部,并按“人数”列对其余行进行排序。是否有一个条件调用,我可以将其输入到range()中以促进这一点?

r dataframe dplyr slice
2个回答
0
投票

Missing
排序后,您可以移动
count
行。

library(dplyr)


peopledata |>
  arrange(desc(count)) |>
  slice(order(gender == 'Missing'))
#>        gender count
#> 1        Male    28
#> 2      Female    14
#> 3 Undisclosed     1
#> 4     Missing   293

创建于 2024-07-30,使用 reprex v2.1.0


0
投票
library(dplyr)
library(forcats)

peopledata |>
  arrange(fct_reorder(gender, count, .desc = T)  |> fct_relevel("Missing", after = Inf))
#        gender count
# 1        Male    28
# 2      Female    14
# 3 Undisclosed     1
# 4     Missing   293
© www.soinside.com 2019 - 2024. All rights reserved.