2016-09-13 3 views
-1

Начиная с таблицы из 372 столбцов и 12 000 строк в R, мне нужно создать новую таблицу с столбцами, содержащими строки с суммой одной строки из столбцов 1: 4 , затем 5: 8, затем 9:12 и т. д. до столбца 372 исходной таблицы. Вот небольшой пример:Суммировать значения групп из 4 смежных столбцов в R

Вход:

m = structure(c(3L, 1L, 2L, 6L, 3L, 1L, 1L, 8L, 1L, 5L, 2L, 1L, 3L, 7L, 
+ 1L, 1L), .Dim = c(2L, 8L), .Dimnames = list(c("r1", "r2"), c("a", "b", 
+"c", "d", "e", "f", "g", "h"))) 

который выглядит следующим образом:

a b c d e f g h 
r1 3 2 3 1 1 2 3 1 
r2 1 6 1 8 5 1 7 1 

Ожидаемый результат:

A B 
r1 9 7 
r2 16 14 

Таким образом, А = а + Ь + с + d и B = e + f + g + h. Простота работы с маленькой таблицей в Excel. Столбцы a-d соответствуют группе, e-f - другой, если это помогает.

+0

Вы, вероятно, нужно 'dput' этого объекта, чтобы сделать эту воспроизводимым, как описано здесь: HTTP: //stackoverflow.com/a/28481250/ В противном случае у вас может быть объект с любым из нескольких классов (data.frame, matrix, table). Например, вы можете отредактировать 'm = structure (c (3L, 1L, 2L, 6L, 3L, 1L, 1L, 8L, 1L, 5L, 2L, 1L, 3L, 7L, 1L, 1L), Dim = c (2L, 8L),.Dimnames = list (c («r1», «r2»), c («a», «b», «c», «d», «e», «f», «g», «h»))) 'в ваш вопрос, если у вас есть матрица. – Frank

+0

Спасибо за подсказку Фрэнк. Я уже редактировал мой вопрос. – fibar

ответ

3

Раствор R основание, предположим df ваш кадр данных:

cols = 8 
do.call(cbind, lapply(seq(1, ncols, 4), function(i) rowSums(df[i:(i+3)]))) 
# [,1] [,2] 
# r1 9 7 
# r2 16 14 
4

Вопрос в настоящее время недоопределенный, но предположим, что у вас есть матрица ...

m = structure(c(3L, 1L, 2L, 6L, 3L, 1L, 1L, 8L, 1L, 5L, 2L, 1L, 3L, 
7L, 1L, 1L), .Dim = c(2L, 8L), .Dimnames = list(c("r1", "r2"), 
    c("a", "b", "c", "d", "e", "f", "g", "h"))) 

Сделайте отображение столбцов:

map = data.frame(old = colnames(m), new = rep(LETTERS, each=4, length.out=ncol(m))) 

    old new 
1 a A 
2 b A 
3 c A 
4 d A 
5 e B 
6 f B 
7 g B 
8 h B 

И затем rowsum:

res = rowsum(t(m), map$new) 

    r1 r2 
A 9 16 
B 7 14 

Мы должны перенести данные с t здесь потому, что R имеет rowsum, но не colsum. Вы можете транспонировать его обратно, например t(res).

+0

Если вы действительно делаете такие имена, как A, B, ... и имеете 374 столбца, вы, конечно, закончите. В этом случае вы можете использовать пары букв (для комбинаций 26^2): вместо «LETTERS» в ответе напишите 'do.call (paste0, expand.grid (LETTERS, LETTERS))' – Frank

+0

Спасибо Frank. Это сработало, включая это последнее предложение для ПИСЬМА. Хотя мой объект - это список. Должны ли мы изменить это в нашем вопросе/ответе? – fibar

+0

@fibar Хм, я не уверен, что вы имеете в виду под списком здесь, но я бы сказал, продолжайте и добавьте его, если считаете, что это актуально. – Frank

0

Вы можете сделать это в векторизованном виде, если вы преобразуете исходные данные в матрицу с 4 столбцами, а затем используйте rowSums, а затем преобразуете ее обратно, чтобы соответствовать строкам исходного фрейма данных. Здесь он находится в одной длинной команде

df <- read.table(header = TRUE, text = "a b c d e f g h 
      3 2 3 1 1 2 3 1 
       1 6 1 8 5 1 7 1") 

    matrix(rowSums(matrix(as.vector(t(as.matrix(df))), 
     ncol = 4, byrow = TRUE)), ncol = ncol(df)/4, byrow = TRUE) 

    #  [,1] [,2] 
    #[1,] 9 7 
    #[2,] 16 14 

Редактировать: сохранить имена строк, если, например, rownames(df) <- c("r1", "r2"), просто примените их к полученной матрице (порядок строк сохраняется), т.е. запустите rownames(result) <- rownames(df).

+0

Было бы неплохо, если бы метки 'r1',' r2' сохранились, я думаю. Не уверен, что это произойдет здесь, поскольку вы исключили их из своего ввода. – Frank

+1

@Frank Я думал, что это просто имена строк. Они могут быть добавлены в конце, я отредактирую сообщение. – konvas

0

Другой способ:

df <- data.frame(t(matrix(colSums(matrix(t(df), nrow=4)),nrow=nrow(df)))) 
## X1 X2 
##1 9 7 
##2 16 14 
  1. Сначала транспонирование данные в 4 x (ncol(df)/4 * now(df)) матрицу, в которой в настоящее время каждый столбец представляет собой группу из четырех столбцов для каждой строки в исходном кадре данных.
  2. Сумма каждого столбца с помощью colSums
  3. Транспонирование данные обратно в кадр данных с исходным числом строк
Смежные вопросы