У меня есть эта проблема с data.table
, которая в последнее время сводит меня с ума. Это похоже на ошибку, но может быть, я не вижу здесь ничего очевидного.data.table НЕ суммируется должным образом по двум столбцам
У меня есть следующий кадр данных:
# First some data
data <- data.table(structure(list(
month = structure(c(1356998400, 1356998400, 1356998400,
1359676800, 1354320000, 1359676800, 1359676800, 1356998400, 1356998400,
1354320000, 1354320000, 1354320000, 1359676800, 1359676800, 1359676800,
1356998400, 1359676800, 1359676800, 1356998400, 1359676800, 1359676800,
1359676800, 1359676800, 1354320000, 1354320000), class = c("POSIXct",
"POSIXt"), tzone = "UTC"),
portal = c(TRUE, TRUE, FALSE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
),
satisfaction = c(10L, 10L, 10L, 9L, 10L, 10L, 9L, 10L, 10L,
9L, 2L, 8L, 10L, 9L, 10L, 10L, 9L, 10L, 10L, 10L, 9L, 10L, 9L,
10L, 10L)),
.Names = c("month", "portal", "satisfaction"),
row.names = c(NA, -25L), class = "data.frame"))
Я хочу суммировать его как portal
и month
. Суммируя со старым добрым tapply
работает, как ожидалось - я получаю 3x2 матрицу с результатами для дек-2012 и январь-февраль 2013 года:
> tapply(data$satisfaction, list(data$month, data$portal), mean)
FALSE TRUE
2012-12-01 8.5 8.000000
2013-01-01 10.0 10.000000
2013-02-01 9.0 9.545455
Резюмируя с by
аргументом data.table
не:
> data[, mean(satisfaction), by = 'month,portal']
month portal V1
1: 2013-01-01 FALSE 10.000000
2: 2013-02-01 TRUE 9.000000
3: 2013-01-01 TRUE 10.000000
4: 2012-12-01 FALSE 8.500000
5: 2012-12-01 TRUE 7.333333
6: 2013-02-01 TRUE 9.666667
7: 2013-02-01 FALSE 9.000000
8: 2012-12-01 TRUE 10.000000
Как вам см., он возвращает таблицу данных с значения, а не как ожидалось; где portal == TRUE
и month == 2012-02-01
дублируются, например.
Интересно, если я ограничить данные этого только до 2013 года, в все работает, как ожидалось:
> data[month >= ymd(20130101), mean(satisfaction), by = 'month,portal']
month portal V1
1: 2013-01-01 TRUE 10.000000
2: 2013-01-01 FALSE 10.000000
3: 2013-02-01 TRUE 9.545455
4: 2013-02-01 FALSE 9.000000
Я озадачен за верю :). Может кто-нибудь, пожалуйста, помогите мне?
Использовать 'by = list (month, portal)' – Andrie
Во-первых, 'data [, mean (satisfaction), by = list (month, portal)]' производит тот же (неверный) результат. Во-вторых, в соответствии с помощью справки 'data.table' поддерживаются оба синтаксиса:« by - одиночное имя без кавычек, список() выражений имен столбцов, одиночная символьная строка, содержащая имена столбцов, разделенных запятыми, или символьный вектор имена столбцов.« –
Кажется, что работает преобразование столбца POSIX в Date (' as.Date'). Я думаю, что data.table (правильно? Неправильно?) Разделяет некоторые слова о том, являются ли некоторые из этих дат «равными». – joran