2017-02-15 4 views
1

У меня следующий набор данныхCasting множественный value.var проконтролировано fun.aggregate

client_id <- c("A", "A", "B", "B", "B", "B", "B", "A", "A", "B", "B") 
value <- c(10, 35, 20, 30, 50, 40, 30, 40, 30, 40, 10) 
period_30 <- c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0) 
period_60 <- c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0) 
sign <- c("D", "D", "D", "D", "C", "C", "C", "D", "D", "D", "D") 

data <- data.frame(client_id, value, period_30, period_60, sign) 

можно использовать этот код, чтобы подсчитать количество различных расколов в данный период с кодом ниже:

library(data.table) 
test<- dcast(setDT(data), client_id ~ paste0("period_30", sign), value.var = "period_30", sum) 

Но я хотел бы также рассчитать значение в соответствии с различными расколами.

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

client_id  av.value_period_30_sign_D av.value_period_60_sign_D av.value_period_30_sign_C av.value_period_30_sign_D 
    A      34.16667      NaN     NaN         NaN 
    B      30.00000     34.16667    NaN        27.50000 

И тогда, она должна быть расширяемой дополнительных разделений, как среднее значение знака X, типа X в период 1.

Я не уверен, что с этим подходом можно добиться желаемого результата. Но я смотрел на аргумент fun.aggregate. Возможно, он может использоваться в сочетании с несколькими value.var аргументами?

Обновление: Код Джоэля отвечает на первую часть вопроса.

client_id sign period_30 period_60 
    A   D  34.16667 34.16667 
    B   D  30.00000 34.16667 
    B   C  NaN   27.50000 

Но как перенести переменные и назначить имена в соответствии с разделителями автоматически?

ответ

1

другой метод (будет быстрее) использует data.table

основе редактировать сделанные на вопрос: (надеюсь, что код Пояснений прямо сейчас)

library(data.table) 
data1 <- setDT(data)[, lapply(.SD, function(x) mean(value[x==1])), 
         .SDcols = period_30:period_60, 
         by = .(client_id, sign)] 
# `dcast` if also from `data.table` package 
dcast(data1, client_id~sign, drop = FALSE, value.var = c("period_30", "period_60")) 
# client_id period_30_C period_30_D period_60_C period_60_D 
#1:   A   NA 34.16667   NA 34.16667 
#2:   B   NaN 30.00000  27.5 34.16667 
+1

Привет, Джоэл, я просто обновляю вопрос. Действительно, ваш код отвечает на первую часть проблемы. Вы хоть представляете, как я могу решить эту проблему? Это было бы очень полезно для меня. – Prometheus

+0

@Prometheus, пожалуйста, проверьте изменения –

+0

Спасибо, Джоэл! Его жизненная заставка :) – Prometheus

0

Можно использовать dplyr; С учетом текущей DF (= тест):

df %>% group_by(sign) %>% summarize(avg.val=mean(value),avg.period1=mean(period_1),avg.period2=mean(period_2),avg.period3=mean(period_3)) 

, который дает:

# A tibble: 2 × 5 
    sign avg.val avg.period1 avg.period2 avg.period3 
    <chr> <dbl>  <dbl>  <dbl>  <dbl> 
1 Credit 39.50  0.50   1.0   1 
2 Debit 36.25  0.25   0.5   1 

Вы можете изменить группировку переменной в group для удовлетворения ваших потребностей.

+0

Мне нужно сгруппировать по нескольким расколов - клиент, знак, тип. И, во-вторых, при таком подходе вам нужно вручную маркировать каждую переменную. Поэтому, если у меня есть 10 периодов, 10 знаков, 10 типов, становится невозможным реализовать:/Вот почему я не могу полагаться на dcast. – Prometheus

+0

Если я правильно понял, для второй части вы можете использовать summaryise_each. Также вы можете группировать по нескольким переменным. Я просто работал над предоставленным вами. – thisisrg