假设这就是R给我的。
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并给出:
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输送到我的代码的其余部分。
发布于 2022-04-10 15:44:24
使用parse_number
可以很容易地用arrange
重新排序行
library(dplyr)
df1 %>%
arrange(readr::parse_number(grp))
-output
grp val
1 <2 0
2 2-5 0
3 6-10 0
4 21-26 0
5 27-32 0
或者使用base R
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
发布于 2022-04-10 15:49:58
您也可以使用基数R显式显示所需的级别(和部队等级顺序):
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
发布于 2022-04-10 16:42:17
不确定这是否正是你想要的,但是如果你有一组原始的数据,你也可以使用cut()
来创建一个有序的因子来聚集你的数据,然后table()
来计算每个切割范围内的频率。
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
https://stackoverflow.com/questions/71818110
复制相似问题