按组对数据框进行重新排列,通过对列进行排序实现。

8

如何有效地完成以下任务?

我有一个数据框,例如:

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","a","b","b","b","c","c","c")
d <- data.frame(v1,v2,lvl)

> d
   v1  v2 l
1 2.2 4.5 a
2 3.2 2.5 a
3 1.2 3.5 a
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

在每个 d$lvl 级别中,我想按照 d$v1 的值对数据框进行排序。因此,我希望得到:

   v1  v2 l
3 1.2 3.5 a
1 2.2 4.5 a
2 3.2 2.5 a

5 2.2 7.5 b
6 3.2 6.5 b
4 4.2 5.5 b

8 1.2 1.5 c
7 2.2 2.5 c
9 5.2 3.5 c
3个回答

12

我认为最直接的方法是

d[order(d$lvl,d$v1),]

提供

   v1  v2 lvl
3 1.2 3.5   a
1 2.2 4.5   a
2 3.2 2.5   a
5 2.2 7.5   b
6 3.2 6.5   b
4 4.2 5.5   b
8 1.2 1.5   c
7 2.2 2.5   c
9 5.2 3.5   c

谢谢Frank!如果我想提取每个水平的v1中位数的所有行,该怎么办? - user2783615
这是一个解决方案,我曾经看到@eddi使用:require(data.table); DT <- data.table(d); DT[DT[,.I[ceiling(.N/2)],by=lvl]$V1]。你可以将分号隔开的内容放在不同的行上。之前有人用data.table回答了你的问题,但我猜他们删除了答案。无论如何,如果你发现自己总是想按组做事情(就像我一样),那么我认为这是一个很棒的包。如果你有另一个类似的问题,你可能想在SO上发布一个新问题。评论中的空间和排版是有限制的。 :) - Frank

3

使用dplyr,您可以在arrange()中添加.by_group = TRUE以对每个组内的列进行排序。尝试:

library(dplyr)
d %>% 
        group_by(lvl) %>%
        arrange(v1, .by_group = TRUE)
# output
# A tibble: 9 x 3
# Groups:   lvl [3]
     v1    v2    lvl
  <dbl> <dbl> <fctr>
1   1.2   3.5      a
2   2.2   4.5      a
3   3.2   2.5      a
4   2.2   7.5      b
5   3.2   6.5      b
6   4.2   5.5      b
7   1.2   1.5      c
8   2.2   2.5      c
9   5.2   3.5      c

1

我认为这也是使用dplyr的合法解决方案:

require(data.table)
require(dplyr)
require(dtplyr)

DT <- as.data.table(d)
DT %>% group_by(lvl) %>% arrange(v1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接