如何在 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参数,但对我尝试过的变体没有任何运气,通常最终会出现有关缺少参数或选择未定义列的错误。如何使用此语法正确实现递减排序和/或以其他方式实现最终结果,而无需显式命名列(它们的名称是日期,因此经常更改(

奖金如何调整此代码以解释具有na.last的 NA

谢谢!

我认为你用你的代码对 data.frame 行进行了破坏,不是一个很好的做法 标准 dplyr 使用 arrange(( 函数,

如下所示
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

data.table包的解决方案如下

library(data.table)
a <- data.table(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))
# alternatively:
# 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))
# setDT(a)
b <- a[, lapply(.SD, sort, decreasing = TRUE), by = name]

.SD返回数据子集,在本例中为by = name创建。它按给定列中的值拆分原始data.table

这也满足您的奖金要求,可以提供na.last

aa <- data.table(name = c("a","a","a","b","b","b"),date1 = c(NA,3,1,3,1,NA),date2 = c(0,2,NA,1,2,0),date3 = c(0,2,0,3,2,NA))
bb <- aa[, lapply(.SD, sort, decreasing = TRUE, na.last = TRUE), by = name]

最新更新