2016-01-27 2 views
-1

у меня есть dataframe в называемой Д.Ф., есть три колонки позволяет сказать,Сортировка столбца dataframe по частоте встречаемости

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 

Теперь я хочу, чтобы отсортировать столбец Зарплата протеканием их по регионам, что использует частотную таблицу или что-то еще, получает вероятность появления на регион и сортирует их. Предположим, что набор данных достаточно большой (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     

с помощью этого мы можем классифицировать добавить новый colu mns в нашем фрейме данных 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

Разве это не просто сортировать по численному значению вместо частоты вхождение? –

+0

вы все равно можете использовать приведенные ниже подходы, насколько я могу судить. – mtoto

+0

Да, но я согласен (отсюда и вверх), надеялся на более элегантное решение, чем у меня –

ответ

5

Один из возможных подходов заключается в использовании 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

еще короче: 'setDT (df) [, .N, by =.(Region, Salary)] [order (-N)] ' – Jaap

+0

, если вы хотите сохранить весь фрейм данных, вам нужно будет добавить в th' freq: = 'снова – Jaap

+0

@Jaap обновленный ответ – mtoto

2
library(dplyr) 
data %>% group_by(Region, Salary) %>% summarise(n=n()) %>% ungroup() %>% arrange(-n) 

(отредактирован: incloude комментарий к ungroup от Яап, хорошая точка)

+0

или: 'df%>% group_by (Region, Salary)%>% summary (n = n())%>% ungroup()%>% arr (-n) ' – Jaap

+0

Включено, спасибо! – PereG

+0

, если вы хотите сохранить весь фрейм данных, тогда вам нужно использовать 'mutate' вместо' summaryise' – Jaap

3

Base 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 
Смежные вопросы