我最关心的问题: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
答案 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