Опережающие вычисления фрейма данных целым - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь написать более сжатый / эффективный код для раздела данных.У меня есть фрейм данных с повторяющимся шаблоном данных, см. Пример ниже.

#Simple Sample Data
 Date_2012<-c(NA,NA,NA)
 X2<-c(1,1,1)
 X3<-c(2,2,2)
 XNA<-c(NA,NA,NA)
 Date_2013<-c(NA,NA,NA)
 X6<-c(3,3,3)
 X7<-c(4,4,4)
 df<-data.frame(Date_2012,X2,X3,XNA,Date_2013,X6,X7)

> df
  Date_2012 X2 X3 XNA Date_2013 X6 X7 XNA
1        NA  1  2  NA        NA  3  4 NA
2        NA  1  2  NA        NA  3  4 NA
3        NA  1  2  NA        NA  3  4 NA

Я хочу провести некоторые вычисления с X2 и X3, а затем перейти к X6 и X7 и выполнить те же вычисления.Эти столбцы, используемые для вычислений, всегда будут заданным числом друг от друга, и мне интересно, что использовать для продвижения вычислений, будь то цикл for или что-то еще.

#Calcuations, how to make this efficient? (loop?)
Calc<-df[,2]*df[,3]
Total2012<-sum(Calc)

Calc2<-df[,6]*df[,7]
Total2013<-sum(Calc2)

#Then continuously update the "Totals"     
Totals<-c(Total2012,Total2013)

# Desired Result
> Totals
[1]  6 36 #.......... with results being added until columns exhausted

В целом, я хотел бы продолжать продвигаться по фрейму данных (может быть, по целому числу?) И выполнять эти вычисления при обновлении списка итогов, как бы я сделал это эффективно?

Я думал об использовании функции дляуправляйте df[A]*df[b], но слишком много столбцов, чтобы сделать его кратким, так как мне пришлось бы многократно вызывать функцию.

Есть ли лучший способ, которого мне не хватает?

Спасиботебе за помощь.

1 Ответ

0 голосов
/ 04 июня 2018

Мы можем сделать что-то подобное, используя sapply:

Totals = sapply((1:ncol(df))[c(FALSE, TRUE, FALSE, FALSE)], 
                function(x) sum(df[,x]*df[,x+1]))

# [1]  6 36

Это создает последовательность индексов столбцов, которая подается в sapply для вычисления суммы столбцов произведения последовательных столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...