首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中字母数字年龄组的重新排序

R中字母数字年龄组的重新排序
EN

Stack Overflow用户
提问于 2022-04-10 15:40:42
回答 3查看 67关注 0票数 3

假设这就是R给我的。

代码语言:javascript
运行
复制
df1 = data.frame(grp = c("<2", "2-5", "21-26","27-32","6-10"), val= rep(0,5))
     grp val
1    <2   0
2   2-5   0
3 21-26   0
4 27-32   0
5  6-10   0

但我希望R能理解6< 21并给出:

代码语言:javascript
运行
复制
df2 = data.frame(grp = as.factor(c("<2", "2-5", "6-10", "21-26", "27-32")), val= rep(0,5))
    grp val
1    <2   0
2   2-5   0
3  6-10   0
4 21-26   0
5 27-32   0

我尝试了gtools中的mixedsort(),但是它返回索引而不是重新排序的dataframe。有什么窍门或想法如何做到这一点?

编辑。感谢美妙的@akrun,我意识到我必须首先将他的dplyr建议的答案分配给另一个对象,比如new_df,然后将new_df输送到我的代码的其余部分。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-10 15:44:24

使用parse_number可以很容易地用arrange重新排序行

代码语言:javascript
运行
复制
library(dplyr)
df1 %>%
   arrange(readr::parse_number(grp))

-output

代码语言:javascript
运行
复制
    grp val
1    <2   0
2   2-5   0
3  6-10   0
4 21-26   0
5 27-32   0

或者使用base R

代码语言:javascript
运行
复制
df1[do.call(order, read.csv(text = gsub("<", "-Inf,", 
    chartr("-", ",", df1$grp)), header = FALSE)),]
    grp val
1    <2   0
2   2-5   0
5  6-10   0
3 21-26   0
4 27-32   0
票数 2
EN

Stack Overflow用户

发布于 2022-04-10 15:49:58

您也可以使用基数R显式显示所需的级别(和部队等级顺序):

代码语言:javascript
运行
复制
grp <- factor(c("<2", "2-5", "6-10", "21-26", "27-32"),
       levels = c("<2", "2-5", "6-10", "21-26", "27-32"),
       ordered = TRUE
       )

注意在本例中使用的是factor而不是as.factor

票数 4
EN

Stack Overflow用户

发布于 2022-04-10 16:42:17

不确定这是否正是你想要的,但是如果你有一组原始的数据,你也可以使用cut()来创建一个有序的因子来聚集你的数据,然后table()来计算每个切割范围内的频率。

代码语言:javascript
运行
复制
set.seed(100)
observations <- rnorm(20, 5, 5)
cut(observations, c(0, 2, 9, 10), include.lowest = T) |>
  table() |>
  data.frame()

#     Var1 Freq
# 1  [0,2]    2
# 2  (2,9]   16
# 3 (9,10]    1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71818110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档