2016-07-12 1 views
-2

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

Следующий код (почти) достигает того, что я хочу, используя цикл for (кроме что я должен вручную выполнить последнюю строку, что на самом деле не проблема). Я хотел бы сделать аналогичную вещь, но использовать функцию apply, поскольку цикл for очень медленный в моем большом наборе данных - однако я не могу понять синтаксис apply.

data<-data.frame(runif(10)) 

data$x<- 
for (i in 1:nrow(data)) { 
    data[i,2 ] <- data[i,1]+data[i+1,1] 
          } 
+0

Что представляет собой последняя сумма строк? Нуль? – Tav

+1

Сделайте несколько исследований, прежде чем задавать вопросы. Вопрос уже существует [здесь] (http://stackoverflow.com/questions/19200841/consecutive-rolling-sums-in-a-vector-in-r?noredirect=1&lq=1). И прочитайте весь ответ, когда pepole потребуется время, чтобы ответить вам, прежде чем подтвердить его. –

ответ

0

Мы можем получить сумму текущего значения с предыдущим значением путем удаления одного значения с любого конца колонны и conctenate с НС.

data$x <- c(data[,1][-1] + data[,1][-nrow(data)], NA) 
1

Используйте rollSum (пакет RcppRoll)

Вы можете использовать функцию roll_sum(x, nb) которые позволяют сделать (последовательный) качению сумму вектора.

если мы возьмем ваш пример:

data<-data.frame(x=runif(10000000)) 
data$sum<-roll_sum(data$x, 1) 

Существует также rollapply(x, nb, fct) из пакета zoo, но менее производительным.

вы можете увидеть микро Benchmark here

Transform данные

Может быть, просто превращая вас вектор, создавая скопировать его меньше первого значения и с 0 на последнее значение будет работать.

data<-data.frame(x=runif(10)) 
data$copy<-c(data$x[-1],0) 
data$sum<-rowSums(data) 
0

Вы можете сделать вектор, который выключен на 1 (она начинается со второго компонента) и добавьте NA в конце его. Затем сделайте сумму.

data<-data.frame(runif(10)) 
col1 <- data$runif.10. 
col1.off <- col1[2:length(col1)] 
col1.off <- c(col1.off, NA) 
data$x <- col1 + col1.off 

 Смежные вопросы

  • Нет связанных вопросов^_^