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) Метод группировки, так как мне нужно, чтобы это было применимо к широкому диапазону кадров данных и факторов группировки.

РЕДАКТИРОВАТЬ: для простоты предположим, что я знаю, какие столбцы являются соответствующими числовыми столбцами. Меня не интересует, как их выбрать, меня интересует, как сделать мою сгруппированную сумму, не испортив исходную структуру фрейма данных.

Спасибо!

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
Другие вопросы по тегам