按 R 中的列组长度对数据帧进行排序
Sort dataframe by column group length in R
我有以下数据框:
v2 <- c(4.5, 2.5, 3.5, 5.5, 7.5, 6.5, 2.5, 1.5, 3.5)
v1 <- c(2.2, 3.2, 1.2, 4.2, 2.2, 3.2, 2.2, 1.2, 5.2)
lvl <- c("a","a","b","b","b","b","c","c","c")
d <- data.frame(v1,v2,lvl)
d
v1 v2 lvl
1 2.2 4.5 a
2 3.2 2.5 a
3 1.2 3.5 b
4 4.2 5.5 b
5 2.2 7.5 b
6 3.2 6.5 b
7 2.2 2.5 c
8 1.2 1.5 c
9 5.2 3.5 c
我想做的是根据 lvl
分组的大小对数据框进行排序。
产生以下结果:
v1 v2 lvl
2.2 4.5 a
3.2 2.5 a
2.2 2.5 c
1.2 1.5 c
5.2 3.5 c
1.2 3.5 b
4.2 5.5 b
2.2 7.5 b
3.2 6.5 b
因为,a
长度为2,c
长度为3,b
长度为4。
如何实现?
d$lvl <- factor(d$lvl, levels = names(sort(table(d$lvl))))
d[order(d$lvl),]
v1 v2 lvl
1 2.2 4.5 a
2 3.2 2.5 a
7 2.2 2.5 c
8 1.2 1.5 c
9 5.2 3.5 c
3 1.2 3.5 b
4 4.2 5.5 b
5 2.2 7.5 b
6 3.2 6.5 b
使用ave
:
d[order(ave(seq(d$lvl),d$lvl,FUN=length)),]
# v1 v2 lvl
#1 2.2 4.5 a
#2 3.2 2.5 a
#7 2.2 2.5 c
#8 1.2 1.5 c
#9 5.2 3.5 c
#3 1.2 3.5 b
#4 4.2 5.5 b
#5 2.2 7.5 b
#6 3.2 6.5 b
这是通过 ave
为每个 d$lvl
值分配整个 d$lvl
组的长度来实现的。 seq
只是生成一个占位符数字变量,ave
可以 运行 并保证没有错误。
ave(seq(d$lvl),d$lvl,FUN=length)
#[1] 2 2 4 4 4 4 3 3 3
order(ave(seq(d$lvl),d$lvl,FUN=length))
#[1] 1 2 7 8 9 3 4 5 6
# a a c c c b b b b
我有以下数据框:
v2 <- c(4.5, 2.5, 3.5, 5.5, 7.5, 6.5, 2.5, 1.5, 3.5)
v1 <- c(2.2, 3.2, 1.2, 4.2, 2.2, 3.2, 2.2, 1.2, 5.2)
lvl <- c("a","a","b","b","b","b","c","c","c")
d <- data.frame(v1,v2,lvl)
d
v1 v2 lvl
1 2.2 4.5 a
2 3.2 2.5 a
3 1.2 3.5 b
4 4.2 5.5 b
5 2.2 7.5 b
6 3.2 6.5 b
7 2.2 2.5 c
8 1.2 1.5 c
9 5.2 3.5 c
我想做的是根据 lvl
分组的大小对数据框进行排序。
产生以下结果:
v1 v2 lvl
2.2 4.5 a
3.2 2.5 a
2.2 2.5 c
1.2 1.5 c
5.2 3.5 c
1.2 3.5 b
4.2 5.5 b
2.2 7.5 b
3.2 6.5 b
因为,a
长度为2,c
长度为3,b
长度为4。
如何实现?
d$lvl <- factor(d$lvl, levels = names(sort(table(d$lvl))))
d[order(d$lvl),]
v1 v2 lvl
1 2.2 4.5 a
2 3.2 2.5 a
7 2.2 2.5 c
8 1.2 1.5 c
9 5.2 3.5 c
3 1.2 3.5 b
4 4.2 5.5 b
5 2.2 7.5 b
6 3.2 6.5 b
使用ave
:
d[order(ave(seq(d$lvl),d$lvl,FUN=length)),]
# v1 v2 lvl
#1 2.2 4.5 a
#2 3.2 2.5 a
#7 2.2 2.5 c
#8 1.2 1.5 c
#9 5.2 3.5 c
#3 1.2 3.5 b
#4 4.2 5.5 b
#5 2.2 7.5 b
#6 3.2 6.5 b
这是通过 ave
为每个 d$lvl
值分配整个 d$lvl
组的长度来实现的。 seq
只是生成一个占位符数字变量,ave
可以 运行 并保证没有错误。
ave(seq(d$lvl),d$lvl,FUN=length)
#[1] 2 2 4 4 4 4 3 3 3
order(ave(seq(d$lvl),d$lvl,FUN=length))
#[1] 1 2 7 8 9 3 4 5 6
# a a c c c b b b b