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