2017-01-31 4 views
0

Я пытаюсь создать процесс агрегации. Я стараюсь избегать проблем, вызванных «expand.grid» (т. Е. Чрезмерной длины вектора).Модель последовательной агрегации - data.frame

Я разработал DataFrame DATA. Первоначально мне приходится совместно применять процесс к P1 и V1 и V2 и P2. После выполнения P1, P2, V1 y V2 необходимо удалить, а выход процесса (два вектора: P12 и V12) добавлен в ДАННЫЕ данных данных и снова повторно применить процесс к векторам V12 и P12 и V3 и P3. Таким образом, до тех пор, пока V3 и P3 не будут удалены, добавлены V123 и P123 и повторно применены к V123 и P123 и V4 и P4. Кадр данных заполняется NA или 0.

Важно отметить, что я обычно работаю с n векторами (Pi) и n векторами (Vi).

Dataframe ДАННЫЕ:

P1 P2 P3 P4   V1  V2   V3 V4 
    1 0 0 0 0 0.34505340 0.9498 0.958886346 0.88 
    2 1 1 1 1 0.11640585 0.0338 0.012040961 0.04 
    3 2 2 2 2 0.09746205 0.0164 0.009259039 0.08 
    4 3 0 3 0 0.11484475 0.0000 0.019813654 0.00 
    5 4 0 0 0 0.32623395 0.0000 0.000000000 0.00 

Пример вывода:

 P12  V12  
1  0 0.1851 
2  1 0.1419 
3  2 0.1794 
4  3 0.1395 
5  4 0.3659 
6  5 -0.0045 
7  6 -0.0141 

С наилучшими пожеланиями, majesus

+0

Вы можете показать установить выходные данные выборки? Я пытаюсь понять, что происходит с P12 или V12 после вашей операции. –

ответ

1

Вы можете сделать следующее с dplyr пошагово мутировать столбцов. Я храню целевые varnames и формулы в строке. Это простой пример для иллюстрации метода. Я предполагаю, что ваш расчет немного сложнее.

df <- data.frame(p1 = 0:4 
       ,p2 = c(0,1,2,0,0) 
       ,p3 = c(0:3,0) 
       ,p4 = c(0,1,2,0,0) 
       ,v1 = rnorm(5) 
       ,v2 = rnorm(5) 
       ,v3 = rnorm(5) 
       ,v5 = rnorm(5)) 

library(dplyr) 
var <- sapply(2:4,function(x) paste0('p',paste0(1:x, collapse=""))) 

form <- sapply(2:4,function(x) paste0("p",paste0(1:(x-1),collapse = ""),"*","p",x)) 

df %>% mutate_(.dots=setNames(form, var)) 

струнные векторы:

> var 
[1] "p12" "p123" "p1234" 
> form 
[1] "p1*p2" "p12*p3" "p123*p4" 

результат:

p1 p2 p3 p4   v1   v2   v3   v5 p12 p123 p1234 
0 0 0 0 0.6901867 0.6365963 0.3526106 -0.8348200 0 0  0 
1 1 1 1 0.1530939 0.8553939 1.2160768 3.1494818 1 1  1 
2 2 2 2 1.2732477 -0.3102100 1.2538673 0.8904290 4 8 16 
3 0 3 0 0.9067448 0.7085275 -1.0328784 0.1979246 0 0  0 
4 0 0 0 -0.1388101 0.1275527 1.6018554 0.4335777 0 0  0 
+0

Благодарим вас за ваш ответ. Моя задача - совместное применение процесса к переменным Pi и Vi, а не только к Pi. Кроме того, мне нелегко запрограммировать процесс в режиме «функции». Могу ли я использовать «while» или «for-loop»? – majesus

+0

Ответ - всего лишь иллюстрация. На самом деле это петля. команда 'mutate_' последовательно оценивает каждый расчет в векторной форме. Таким образом, вам нужно убедиться, что в этом векторе есть также расчет для v12 v123 и v1234. – Wietze314

+0

Это замечательно! Большое спасибо. – majesus