2017-02-20 9 views
0

Этот вопрос является продолжением предыдущего вопроса, который я опубликовал, но который я понял, терпит неудачу, когда я веду группировку. linkСмешивание SDcols с ifelse и сгруппированными переменными

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

Моя попытка:

library(data.table) 
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") 

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

result <- setDT(test)[, lapply(.SD, function(i) {ifelse(1 %in% i, mean(test$value), 0)}), 
        .SDcols = period_30:period_60, 
        by=.(client_id, sign)] 

С выше результата я получаю код нонсенс, но я полагаю, я нахожусь на правильном пути. Я просто не знаю, как исправить инструкцию ifelse.

Ожидаемый результат

Client ID  average_value_period30 average_value_period60 
    A     22.5      29 

Кто-нибудь?

+0

на основе данных, которые вы показали, тем 'average_value_period60' 22.5 (если я не ошибаюсь) для CLIENT_ID А – akrun

ответ

2

Нам нужны

setDT(test)[, lapply(.SD, function(i) 
    mean(value[i==1])) ,client_id, .SDcols = period_30:period_60] 
+0

Ну, это дает означает для клиента А за период 30 34.1667. Хотя этот клиент имеет две транзакции в период 30 со значением 10 и 35. Таким образом, это должно быть 45/2 = 22,5. Если я беру сумму, например, она дает 205 для клиента А в период 30, тогда как это должно быть 45. Я не получаю его. : S – Prometheus

+0

@Prometheus За период 30 я также получаю 22.5 – akrun

+0

@Prometheus Используете ли вы более новую версию data.table? Я использую обновление 1.10.0 – akrun