如何对数据框列的频率分布进行排序

时间:2018-05-07 01:12:04

标签: r

我最关心的问题:Convert a data frame column into a frequency distribution in R

其他问题主要是关于策划;不是我需要的

这篇文章提出的问题多于引用的问题;也就是说,一旦使用"表"将所讨论的列表示为频率分布,如何对该频率分布进行排序?

简单示例:定义数据框:

a <- c(13, 14, 15, 16, 15, 15, 22, 21, 44, 21)
b <- c(16, 17, 17, 18, 18, 22, 17, 16, 16, 17)
test <- data.frame(a, b)

> test
    a  b
1  13 16
2  14 17
3  15 17
4  16 18
5  15 18
6  15 22
7  22 17
8  21 16
9  44 16
10 21 17

查找第二列数据帧的频率分布&#34; test&#34;

fd.test <- data.frame(table(test$b))

> fd.test
  Var1 Freq
1   16    3
2   17    4
3   18    2
4   22    1

现在尝试对列&#34; Freq&#34;:

进行排序
fd.test.sort <- fd.test[order(fd.test$Freq)]  

以上返回&#34;选择了未定义的列&#34;

特别令人困惑的是,当我打字时,&#34; Freq&#34;建议作为列名,然后我选择。

我也尝试了以下内容:

fd.test.sort <- fd.test[order(fd.test [, 2])] 

但是返回相同的错误消息

使用这个例子,我要找的是:

> fd.test.sort
  Var1 Freq
1   17    4
2   16    3
3   18    2
4   22    1

2 个答案:

答案 0 :(得分:1)

使用dplyr执行此操作的另一种方法是:

test %>% 
    count(b) %>%
    arrange(desc(n))

desc()用于按降序排序。输出:

# A tibble: 4 x 2
      b     n
  <dbl> <int>
1    17     4
2    16     3
3    18     2
4    22     1

答案 1 :(得分:1)

基数R中的order函数返回调用它的向量的有序索引值,在这种情况下如下所示:

order(fd.test$Freq)
# [1] 4 3 1 2

然后可以使用这些值将矢量“索引”到有序矢量中:

fd.test$Var1[order(fd.test$Freq)]
# [1] 22 18 16 17

但是,使用order对具有多个维度的对象进行排序时,必须指明应对哪个维度进行排序。如果在这种情况下,目标是对data.frame的行进行排序(并返回其所有列),则需要使用尾随逗号。此外,要按降序排序,请使用减号(-)来反转order的输出:

# equivalent to fd.test[c(2, 1, 3, 4),]
fd.test[order(-fd.test$Freq),]

#   Var1 Freq
# 2   17    4
# 1   16    3
# 3   18    2
# 4   22    1