2013-03-15 7 views
4

Я хотел бы сгруппировать эти данные, но при группировании применять различные функции к некоторым столбцам.R - Групповые данные, но применяются разные функции для разных столбцов

ID type isDesc isImage 
1 1 1  0 
1 1 0  1 
1 1 0  1 
4 2 0  1 
4 2 1  0 
6 1 1  0 
6 1 0  1 
6 1 0  0 

Я хочу группе ID, столбцы isDesc и isImage можно суммировать, но я хотел бы получить значение типа, как это. type будет одинаковым во всем наборе данных. Результат должен выглядеть следующим образом:

ID type isDesc isImage 
1 1 1  2 
4 2 1  1 
6 1 1  1 

В настоящее время я использую

library(plyr) 
summarized = ddply(data, .(ID), numcolwise(sum)) 

но это просто суммирует все столбцы. Вам не нужно использовать ddply, но если вы считаете, что это хорошо для работы, я хотел бы придерживаться ее. data.table библиотека является также альтернативой

+0

Что вы будете делать, если для ID есть несколько типов? Просто возьмите один (выбранный любым способом) или вы действительно хотите группировать как по ID, так и по типу? Это похоже на запрос SQL (см. «Group by»). – igelkott

ответ

4

Использование data.table:

require(data.table) 
dt <- data.table(data, key="ID") 
dt[, list(type=type[1], isDesc=sum(isDesc), 
        isImage=sum(isImage)), by=ID] 

# ID type isDesc isImage 
# 1: 1 1  1  2 
# 2: 4 2  1  1 
# 3: 6 1  1  1 

Использование plyr:

ddply(data , .(ID), summarise, type=type[1], isDesc=sum(isDesc), isImage=sum(isImage)) 
# ID type isDesc isImage 
# 1 1 1  1  2 
# 2 4 2  1  1 
# 3 6 1  1  1 

Edit: Использование data.table «s .SDcols, вы можете сделать это в случае, если вы слишком многие столбцы, которые должны быть суммированы, и другие столбцы, которые должны быть просто приняты первым значением.

dt1 <- dt[, lapply(.SD, sum), by=ID, .SDcols=c(3,4)] 
dt2 <- dt[, lapply(.SD, head, 1), by=ID, .SDcols=c(2)] 
> dt2[dt1] 
# ID type isDesc isImage 
# 1: 1 1  1  2 
# 2: 4 2  1  1 
# 3: 6 1  1  1 

Вы можете указать имена столбцов или номера столбцов в качестве аргументов .SDcols. Пример: .SDcols=c("type") также действителен.

+0

Привет, Arun: D, есть ли возможность определить «все столбцы, кроме x»? Я имею дело с около 70 столбцов, большинство из них будут «sum», но только некоторые из них должны быть «уникальными». Tnx – Alan

+0

@frinx, проверьте правильность. – Arun

+0

tnx, я думаю, что это работает, я просто добавил setkey, чтобы код был завершен. – Alan