我有一个名为df的数据框,有三列可以说,
Region ID Salary
1 A1 100
1 A2 1001
1 A3 2000
1 A4 2431
1 A5 1001
..............
..............
2 A6 1002
2 A7 1002
2 A8 1002
3 A9 3001
3 A10 3001
3 A11 4001
现在我想根据Region的出现来排序列Salary,即使用频率表或其他东西,获取每个区域出现的概率并对它们进行排序。请假设数据集足够大(1000行)
P.S:任何人都可以建议一个好的方法来做一些。请在答案中使用列名,因为真实表中间有一些列提前致谢
**EDIT 1**
我认为我不够清楚,感谢所有回复的人,我真诚地为不清楚而道歉:
使用当前数据集,我们需要创建一个频率表:
Region Salary(bin) Count
1 1K 6
1 5K 3
1 2K 2
1 15K 2
1 0.5K 2
1 24K 1
1 0K 0
使用这个我们可以分类在我们的数据框df中添加一个名为bin的桶(直方图中的桶)
Region ID Salary (bin) Count
1 A1 100 1K 6
1 A2 1001 2K 2
1 A3 2000 2K 2
1 A4 2431 5K 3
..........................所以...............
我们可以使用以下方式完成上述操作:
df$bin <- cut(df$salary, breaks=hist(df$salary)$breaks)
按地区和计算和薪资排序后,我们得到:
Region ID Salary (bin) Count
1 A1 100 1K 6
1 A4 2431 5K 3
1 A3 2000 2K 2
1 A2 1001 2K 2
如您所见,我们需要为每个区域创建频率表并进行排序。我使用Tableau完成了上述操作,但我想在R
中自动执行此操作希望我很清楚
答案 0 :(得分:8)
一种可能的方法是使用data.table
添加freq
列,然后相应地对数据进行排序:
library(data.table)
setDT(df)[,freq := .N, by = c("Region","Salary")]
# Sort
df[order(freq, decreasing = T),]
# As a oneliner (thx @Jaap)
setDT(df)[, freq := .N, by = .(Region,Salary)][order(-freq)]
答案 1 :(得分:5)
基地R:
df <- transform(df, freq= ave(seq(nrow(df)), Salary, FUN=length))
df[order(-df$freq), ]
输出:
Region ID Salary freq
6 2 A6 1002 3
7 2 A7 1002 3
8 2 A8 1002 3
2 1 A2 1001 2
5 1 A5 1001 2
9 3 A9 3001 2
10 3 A10 3001 2
1 1 A1 100 1
3 1 A3 2000 1
4 1 A4 2431 1
11 3 A11 4001 1
答案 2 :(得分:2)
library(dplyr)
data %>% group_by(Region, Salary) %>% summarise(n=n()) %>% ungroup() %>% arrange(-n)
(编辑:来自Jaap ungroup
的评论,好点)