我有一个如下数据框:
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
我该如何解决这个问题?
答案 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