2013-11-20 4 views
1

У меня есть простая проблема с R, но я просто не могу найти ответ. У меня есть dataframe так:R: Объединить строки в том же data.frame

A 1 0 0 0 0 0 
B 0 1 0 0 0 0 
B 0 0 1 0 0 1 
B 0 0 0 0 1 0 
C 1 0 0 0 0 0 
C 0 0 0 1 1 0 

И я хочу, чтобы это было именно так:

A 1 0 0 0 0 0 
B 0 1 1 0 1 1 
C 1 0 0 1 1 0 

Большое спасибо!

С уважением Lisanne

ответ

3

Вот один possbility с помощью tapply:

cbind(unique(dat[1]), do.call(rbind, tapply(dat[-1], dat[[1]], colSums))) 

# V1 V2 V3 V4 V5 V6 V7 
# 1 A 1 0 0 0 0 0 
# 2 B 0 1 1 0 1 1 
# 5 C 1 0 0 1 1 0 

где dat это имя вашего фрейма данных.

+0

Благодаря Свену этот ответ работает на меня! :) – Lisann

4
dat <- structure(list(V1 = structure(c(1L, 2L, 2L, 2L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), V2 = c(1L, 0L, 0L, 0L, 1L, 0L), 
    V3 = c(0L, 1L, 0L, 0L, 0L, 0L), V4 = c(0L, 0L, 1L, 0L, 0L, 
    0L), V5 = c(0L, 0L, 0L, 0L, 0L, 1L), V6 = c(0L, 0L, 0L, 1L, 
    0L, 1L), V7 = c(0L, 0L, 1L, 0L, 0L, 0L)), .Names = c("V1", 
"V2", "V3", "V4", "V5", "V6", "V7"), class = "data.frame", row.names = c(NA, 
-6L)) 

Вы могли бы ...

aggregate(.~ V1 , data =dat, sum) 

или

library(plyr) 
ddply(dat, .(V1), function(x) colSums(x[,2:7]) ) 

Если вы работаете с data.frame где есть дубликаты, но вы хотите только наличие или отсутствие 1 Следует отметить, что после этих функций вы можете сделать что-то вроде dat[!(dat %in% c(1,0)] <- 1.

+1

+1 Гораздо лучше, чем у меня. –

1

Возможна не упомянутая функция агрегата. Я думаю, что это вполне «читаемо».

aggregate(cbind(data$X1, data$X2, data$X3, data$X4), 
by = list(category = data$group), FUN = sum) 
Смежные вопросы