Как сделать summarize a data.table with unreliable data через несколько столбцов?Подведите таблицу данных по нескольким столбцам
В частности, учитывая
fields <- c("country","language")
dt <- data.table(user=c(rep(3, 5), rep(4, 5)),
behavior=c(rep(FALSE,5),rep(TRUE,5)),
country=c(rep(1,4),rep(2,6)),
language=c(rep(6,6),rep(5,4)),
event=1:10, key=c("user",fields))
dt
# user behavior country language event
# 1: 3 FALSE 1 6 1
# 2: 3 FALSE 1 6 2
# 3: 3 FALSE 1 6 3
# 4: 3 FALSE 1 6 4
# 5: 3 FALSE 2 6 5
# 6: 4 TRUE 2 5 7
# 7: 4 TRUE 2 5 8
# 8: 4 TRUE 2 5 9
# 9: 4 TRUE 2 5 10
# 10: 4 TRUE 2 6 6
Я хочу, чтобы получить
# user behavior country.name country.support language.name language.support
# 1: 3 FALSE 1 0.8 6 1.0
# 2: 4 TRUE 2 1.0 5 0.8
(здесь х.name
является наиболее распространенным х для user
и х.support
является доля события, где эта вершина x наблюдалось)
без того, чтобы пройти через обе fields
вручную, как это:
users <- dt[, sum(behavior) > 0, by=user] # have behavior at least once
setnames(users, "V1", "behavior")
dt.out <- dt[, .N, by=list(user,country)
][, list(country[which.max(N)],max(N)/sum(N)), by=user]
setnames(dt.out, c("V1", "V2"), paste0("country",c(".name", ".support")))
users <- users[dt.out]
dt.out <- dt[, .N, by=list(user,language)
][, list(language[which.max(N)], max(N)/sum(N)), by=user]
setnames(dt.out, c("V1", "V2"), paste0("language",c(".name", ".support")))
users <- users[dt.out]
users
# user behavior country.name country.support language.name language.support
# 1: 3 FALSE 1 0.8 6 1.0
# 2: 4 TRUE 2 1.0 5 0.8
Фактическое количество fields
составляет 5 и я хочу, чтобы избежать необходимости повторять один и тот же код для каждого поля в отдельности, и нужно отредактировать эту функцию, если я когда-либо изменю fields
. Обратите внимание, что этот вопрос является сущностью этого вопроса, подсчет поддержки был любезно объяснен мне elsewhere.
Как и в the referenced question, мой набор данных имеет около 10^7 строк, поэтому мне действительно нужно решение, которое масштабируется; было бы неплохо, если бы я мог избежать ненужного копирования, например, в users <- users[dt.out]
.
Не могли бы вы объяснить, что такое 'x.support' –
@RicardoSaporta: Я добавил несколько слов о том, что такое' support', но вы должны посмотреть ссылочный вопрос для получения более подробной информации. – sds
Вы можете заменить 'dt [, sum (поведение)> 0, by = user]' на 'dt [, any (behavior), by = user]'. Вы также должны объяснить, почему вы хотите программно обращаться к нескольким столбцам. Либо у вас всего несколько столбцов, то, вероятно, это не стоит беспокоиться. Или у вас много столбцов, тогда было бы лучше изменить формат data.table в формате long. – Roland