2015-06-11 3 views
1

У меня есть кадр данных с последовательностью числовых столбцов, окруженных с обеих сторон (несущественными) столбцами символов. Я хочу получить новый фрейм данных, который сохраняет положение неуместных столбцов и добавляет числовые столбцы друг к другу с помощью определенного вектора группировки (или применяет некоторые другие функции по строкам к кадру данных по группам). Пример:R data.frame: rowSums выбранных столбцов путем группирования вектора

sample = data.frame(cha1 = c("A","B"),num1=1:2,num2=3:4,num3=11:12,num4=13:14,cha2=c("C","D")) 
> sample 
    cha1 num1 num2 num3 num4 cha2 
1 A 1 3 11 13 C 
2 B 2 4 12 14 D 

с целью получить

> goal 
    cha1 X1 X2 cha2 
1 A 4 24 C 
2 B 6 26 D 

т.е. я суммируется 4 числовых столбцов в соответствии с группировкой вектора gl(2,2,4) = (1,1,2,2) [levels: 1,2]

Для чисто цифрового кадра данных, я нашел следующий метод:

sample_num = sample[,2:5] #select numeric columns 
data.frame(t(apply(sample_num,1,function(row) tapply(row, INDEX=gl(2,2,4),sum)))) 

Я мог бы комбинировать это с повторным использованием, вставляя столбцы символов, чтобы дать ожидаемый результат, но я действительно ищу более элегантный способ. Меня особенно интересует метод plyr, если он есть, поскольку я пытаюсь перейти на plyr для всех моих манипуляций с фреймами данных. Я предполагаю, что первым шагом было бы превратить фрейм данных в длинный формат, но я не знаю, как исходить оттуда.

Требование «абсолютное» состоит в том, что я не могу обойтись без метода группировки gl(n,k,l), поскольку мне нужно, чтобы это применимо к широкому спектру кадров данных и факторов группировки.

EDIT: для простоты предположим, что я знаю, какие столбцы являются соответствующими числовыми столбцами. Я не забочусь о том, как их выбирать, я занимаюсь тем, как выполнять свою группированную сумму, не испортив исходную структуру фреймов данных.

Спасибо!

+0

Я не unterstand, как работает группировка? где можно найти вектор группировки? пожалуйста, обновите свои данные выборки, включая вектор группировки – grrgrrbla

+0

, в этом случае выбранный вектор группировки i (произвольно) - '(1,1,2,2)' i.e. Я хочу добавить первые два столбца и два вторых столбца. Для четырех столбцов это может быть любой коэффициент длины 4 с до 4 уровнями, например. (1,1,1,2) или (1,2,3,3). – user28400

+1

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

ответ

-1
Grpindex<-gl(2,2,4)  
goal<-cbind.data.frame(sample["cha1"],(t(rowsum(t(sample[,2:5]), paste0("X",Grpindex)))),sample["cha2"]) 

Выход:

cha1 X1 X2 cha2 
1 A 4 24 C 
2 B 6 26 D