首页 > 解决方案 > 如何按降序对数据帧进行排序 lapply 并在 r 中排序

问题描述

不确定这是否是重复的,但我找不到任何可以解决我原来的问题或我遇到的部分问题的问题。

目标是按列独立对数据框进行排序。

可重现的例子

a <- data.frame(name = c("a","a","a","b","b","b"),date1 = c(2,3,1,3,1,2),date2 = c(0,2,3,1,2,0),date3 = c(0,2,0,3,2,1))
a
  name date1 date2 date3
1    a     2     0     0
2    a     3     2     2
3    a     1     3     0
4    b     3     1     3
5    b     1     2     2
6    b     2     0     1

b <- ddply(a, "name", function(x) { as.data.frame(lapply(x, sort))
b
  name date1 date2 date3
1    a     1     0     0
2    a     2     2     0
3    a     3     3     2
4    b     1     0     1
5    b     2     1     2
6    b     3     2     3

现在这按预期工作,但与我想要做的相反。期望的输出

b
  name date1 date2 date3
1    a     3     3     2
2    a     2     2     0
3    a     1     0     0
4    b     3     2     3
5    b     2     1     2
6    b     1     0     1

我尝试添加decreasing=T参数,但对我尝试过的变体没有任何运气,通常最终会出现有关缺少参数或选择未定义列的错误。如何使用这种语法正确实现递减排序和/或以其他方式在不依赖显式命名列的情况下实现最终结果(它们的名称是日期,因此经常更改)

奖金 如何调整此代码以解释 NAna.last

谢谢!

标签: rdataframedplyr

解决方案


我认为您使用代码对 data.frame 行进行了核对,这不是一个很好的实践标准 dplyr 使用这样的排列()函数

library(tidyverse)

a <- data.frame(name = c("a","a","a","b","b","b"),date1 = c(2,3,1,3,1,2),date2 = c(0,2,3,1,2,0),date3 = c(0,2,0,3,2,1))

a %>% 
  arrange(name,-date1)

如果你想过上危险的生活,这里就是它的代码

a %>% 
  group_by(name) %>% 
  mutate_all(sort,decreasing  = TRUE)

  name  date1 date2 date3
  <fct> <dbl> <dbl> <dbl>
1 a         3     3     2
2 a         2     2     0
3 a         1     0     0
4 b         3     2     3
5 b         2     1     2
6 b         1     0     1

推荐阅读