2016-11-04 7 views
1

Мой фрейм данных содержит в основном catagorical столбцы и один числовой столбец, ФР выглядит следующим образом (упрощенно):подведение итогов и агрегирование значений столбцов в виде строк в R

**Home_type**  **Garden_type**  **NaighbourhoOd** **Rent** 
Vila    big     brooklyn    5000 
Vila    small    bronx    7000 
Condo    shared    Sillicon valley  2000 
Appartment   none     brooklyn    500 
Condo    none     bronx    1700 
Appartment   none     Sillicon Valley  800 

Для каждого catagorical столбца, я хочу, чтобы отобразить все его отличные значения, частота и сумма арендной платы, связанные с ней.

Результат должен выглядеть следующим образом:

**Variable**  **Distinct_values**  **No_of-Occurences**  **SUM_RENT** 
    Home_type  Vila      2      12000 
    Home_type  Condo     2      3700 
    Home_type  Appartment    2      1300 
    Garden_type  big      1      5000 
    Garden_type  small     1      7000 
    Garden_type  shared     1      2000 
    Garden_type  none      3      3000 
    Naighbourhood brooklyn     2      5500 
    Naighbourhood Bronx     2      8700 
    Naighbourhood Sillicon Valley   2      2800 

Я новичок в R и попытался сделать это с помощью расплава в reshape2 но нету имели большой успех, любая помощь будет оценен.

+0

Вы можете посмотреть на [этот обзор для задавать хорошие вопросы R] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible- пример), особенно на участках, которые дают способы легко прочитать ваши данные. Намного легче помочь, если нам не нужно бороться, чтобы читать ваши данные в R –

+0

Спасибо, что указали мне, Марк, я обязательно буду более осторожен в будущем и отредактирую это сообщение позже. –

ответ

2

Я предпочитаю tidyr к reshape2 в последнее время, хотя это в основном потому, что синтаксис больше похож на dplyr - что сделает эту задачу еще проще, а также за счет загрузки magrittr трубы (%>%), и это сводные данные инструменты.

Во-первых, мы gather (от tidyr) все столбцы без аренды в длинную форму (запустите только эти две строки, чтобы увидеть результат). Затем group_by столбцы, которые вы хотите сгруппировать. Наконец, summarise в каждой группе, чтобы получить нужные показатели.

df %>% 
    gather(Variable, Distinct_Values, -Rent) %>% 
    group_by(Variable, Distinct_Values) %>% 
    summarise(
    `No_of-Occurences` = n() 
    , SUM_RENT = sum(Rent) 
) 

дает:

 Variable Distinct_Values `No_of-Occurences` SUM_RENT 
      <chr>   <chr>    <int> <int> 
1 Garden_type    big     1  5000 
2 Garden_type   none     3  3000 
3 Garden_type   shared     1  2000 
4 Garden_type   small     1  7000 
5  Home_type  Appartment     2  1300 
6  Home_type   Condo     2  3700 
7  Home_type   Vila     2 12000 
8 NaighbourhoOd   bronx     2  8700 
9 NaighbourhoOd  brooklyn     2  5500 
10 NaighbourhoOd Sillicon valley     1  2000 
11 NaighbourhoOd Sillicon Valley     1  800 

(Обратите внимание, что ваши данные есть "V" и "V" для "Силиконовой долины", вызывая две отдельные линии.)

+0

Отлично работает, спасибо. Я не знал о тидире, определенно буду использовать больше его. –

1

Мы можем использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df1)), melt из формата 'wide' в 'long', сгруппированные по 'variable', 'value' (столбцы, созданные из melt), мы создаем два столбца ' No_of_occur ',' SUM_RENT 'в качестве количества строк (.N) и sum столбца «Аренда», а затем сгруппированы по «переменной», «No_of_occur» и «SUM_RENT», получите unique элементов столбца «значение» («Distinct_values» «)

library(data.table) 
melt(setDT(df1), id.var=c('Rent'))[, c("No_of_occur", "SUM_RENT") := 
     .(.N, sum(Rent)) ,.(variable, value)][, 
    .(Distinct_values = unique(value)) , .(variable, No_of_occur, SUM_RENT)] 
#   variable No_of_occur SUM_RENT Distinct_values 
#1:  Home_type   2 12000   Vila 
#2:  Home_type   2  3700   Condo 
#3:  Home_type   2  1300  Appartment 
#4: Garden_type   1  5000    big 
#5: Garden_type   1  7000   small 
#6: Garden_type   1  2000   shared 
#7: Garden_type   3  3000   none 
#8: NaighbourhoOd   2  5500  brooklyn 
#9: NaighbourhoOd   2  8700   bronx 
#10:NaighbourhoOd   2  2800 Sillicon Valley