2013-04-09 3 views
3

Предположим, я следующий кадр данных:Программно суммировать столбцы кадра данных?

dd <- data.frame(x1 = c(1, 2, 3), x2 = c(3, 4, 5), x3 = (5, 6, 7)) 

Я хочу, чтобы создать новый столбец, например, так:

dd$x.sum <- dd$x1 + dd$x2 + dd$x3 

Но вместо того, чтобы выписывать добавление (предположим, я на самом деле есть 100 столбцов x1, x2, ..., x100 что я хочу суммировать вместе), я хочу написать это программно. Что-то вроде:

dd$x.sum <- sum(sapply(1:3, function(i) { 
           return(dd[paste0("x", i)]) 
          })) 

За исключением этого не работает.

Как это сделать?

+1

делает 'dd' другие столбцы с разными именами? В противном случае это должно работать - 'dd $ x.sum <- rowSums (dd)'? – Nishanth

+1

Да, 'dd' имеет другие столбцы, которые я не хочу в сумме. – grautur

ответ

5

Вы также можете использовать Reduce с +, хотя это не будет иметь na.rm аргумент

dd <- data.frame(matrix(runif(1e6),ncol=1000)) 

dd$sum <-  Reduce('+', dd[paste0('X',seq_len(1000))]) 


# some benchmarking 
xx <- paste0("X", seq_len(1000)) 
library(microbenchark) 
microbenchmark(Reduce('+', dd[xx]), rowSums(dd[xx])) 
## Unit: milliseconds 
##    expr  min  lq median  uq  max neval 
## Reduce("+", dd[xx]) 14.93642 15.19713 15.56077 15.78606 31.92162 100 
## rowSums(dd[xx]) 30.79629 31.44574 31.67192 32.14342 58.07938 100 
+0

Вау, я бы не ожидал, что –

+0

Я тоже не @RicardoSaporta, 'rowSums' не преобразовывается в матрицу внутри, возможно, это то, что замедляет ее вниз. – mnel

+0

Определенно приятно знать. И я задаюсь вопросом, насколько «+» является примитивным и вступает в игру –

1

Там нет необходимости для итерации:

dd$sum <- rowSums(dd[paste0("x", 1:3)]) 

Однако, если вы хотите перебрать вы можете над самим индексом:

dd$sum <- rowSums(sapply(paste0("x", 1:3), function(ind) dd[[ind]])) 

Причина sum(sapply(...)) заявление не работает поскольку у вас есть это потому, что sapply возвращает список, и sum не может принять в качестве аргумента список

+0

@mnel, я не следую. Я не вижу разницы между тем, что у вас есть в комментарии, и тем, что он в моем ответе? –

+1

Хммм, я уверен, что первой строки не было, когда я прокомментировал. Неважно. – mnel

+0

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