使用R根据数据帧中的列的值的频率对数据进行分组

时间:2017-06-19 05:26:59

标签: r dataframe data.table frequency

我有一个如下数据框:

a  b
1  23
2  34
1  34
3  45
1  56
3  567
2  67
2  90
1  91
3  98

我想获取数据框,其中行根据第一列中的值的频率进行分组。输出应如下所示:

a  b  freq
1  23   4
1  34   4
1  56   4
1  91   4
2  34   3
2  67   3
2  90   3
3  45   3
3  567  3
3  98   3

我在R中编写了以下代码:

import library(dplyr)
setDT(df)[,freq := .N, by = "a"]
sorted = df[order(freq, decreasing = T),]
sorted

但是,我得到以下数据框作为输出。

    a  b freq
 1: 1  23    4
 2: 1  34    4
 3: 1  56    4
 4: 1  91    4
 5: 2  34    3
 6: 3  45    3
 7: 3  567   3
 8: 2  67    3
 9: 2  90    3
10: 3  98    3

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

我们可以使用n()

library(dplyr)
df1 %>%
    group_by(a) %>%
    mutate(freq = n()) %>%
    arrange(a, desc(freq))
# A tibble: 10 x 3
# Groups:   a [3]
#       a     b  freq
#  <int> <int> <int>
# 1     1    23     4
# 2     1    34     4
# 3     1    56     4
# 4     1    91     4
# 5     2    34     3
# 6     2    67     3
# 7     2    90     3
# 8     3    45     3
# 9     3   567     3
#10     3    98     3

答案 1 :(得分:1)

您似乎想要使用ContentResolver包中的setorder。 您已按data.table订购了数据,但您还想在列freq上应用订单。

a示例:

setorder

答案 2 :(得分:1)

> df <- read.table(text = 'a  b
+ 1  23
+ 2  34
+ 1  34
+ 3  45
+ 1  56
+ 3  567
+ 2  67
+ 2  90
+ 1  91
+ 3  98', header = T, stringsAsFactors = F)
> 
> df %>% group_by(a) %>%
+   mutate(Freq = n()) %>%
+   ungroup() %>%
+   arrange(a)
# A tibble: 10 × 3
       a     b  Freq
   <int> <int> <int>
1      1    23     4
2      1    34     4
3      1    56     4
4      1    91     4
5      2    34     3
6      2    67     3
7      2    90     3
8      3    45     3
9      3   567     3
10     3    98     3