在R中按绝对值排序而不更改数据

时间:2019-05-15 16:42:39

标签: r

我想知道是否可以在不更改任何行关联的情况下,根据一个数字列的绝对值对数据进行排序。

我有此数据:

name <- NULL; value <- NULL
for (i in 1:7) {
  name[i] <- paste0("var", i)
  value[i] <- 4 - i 
}

df <- data.frame(name, value = sample(value,size = 7)); df #set.seed(1)

  name value
1 var1     2
2 var2     1
3 var3    -2
4 var4     0
5 var5     3
6 var6    -3
7 var7    -1

预期输出:

df.sorted
  name value
1 var5     3
2 var6    -3
3 var1     2
4 var3    -2
5 var2     1
6 var7    -1
7 var4     0

我尝试了使用setordervsort的几种方法,但是我不知道如何扩展value列的排序(按绝对值)然后对{ {1}}列。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

创建一个排序向量,并以此排序df。不使用任何软件包。

o <- order(abs(df$value), decreasing = TRUE)
df[o, ]

给予:

  name value
5 var5     3
6 var6    -3
1 var1     2
3 var3    -2
2 var2     1
7 var7    -1
4 var4     0

注意

如果在具有相同abs(value)的多行中,您要按value的降序对其进行排序,请对o使用此命令:

o <- order(abs(df$value), df$value, decreasing = TRUE)

答案 1 :(得分:4)

使用base

df[sort(abs(df$value),decreasing=T,index.return=T)[[2]],]
  name value
5 var5     3
6 var6    -3
1 var1     2
3 var3    -2
2 var2     1
7 var7    -1
4 var4     0

如果您愿意使用dplyr

df %>% 
   arrange(desc(abs(value)))
  name value
1 var5     3
2 var6    -3
3 var1     2
4 var3    -2
5 var2     1
6 var7    -1
7 var4     0