Проведите вдоль строк фрейма данных и сравните строки со следующими строками - PullRequest
2 голосов
/ 02 апреля 2020

Полагаю, что-то подобное нужно было задавать раньше, однако я смог найти ответ только для python и SQL. Поэтому, пожалуйста, сообщите мне в комментариях, когда об этом также попросили R!


Данные
Допустим, у нас есть такой фрейм данных:

set.seed(1); df <- data.frame( position = 1:20,value = sample(seq(1,100), 20))
# In cause you do not get the same dataframe see the comment by @Ian Campbell - thanks!
   position value
1         1    27
2         2    37
3         3    57
4         4    89
5         5    20
6         6    86
7         7    97
8         8    62
9         9    58
10       10     6
11       11    19
12       12    16
13       13    61
14       14    34
15       15    67
16       16    43
17       17    88
18       18    83
19       19    32
20       20    63

Цель
Мне интересно вычислить среднее value для n позиций и вычесть это из среднего value следующих n позиций скажем n=5 пока.


То, что я пробовал
Я сейчас использовал этот метод, однако, когда я применяю его к большему кадру данных, это занимает огромное количество времени, и, следовательно, интересно, есть ли более быстрый метод для этого.

calc <- function( pos ) {
  this.five <- df %>% slice(pos:(pos+4)) 
  next.five <-  df %>% slice((pos+5):(pos+9))
  differ = mean(this.five$value)- mean(next.five$value)
  data.frame(dif= differ)
}

df %>% 
  group_by(position) %>%
  do(calc(.$position))

, который приводит к следующей таблице:

  position     dif
      <int>   <dbl>
 1        1 -15.8  
 2        2   9.40 
 3        3  37.6  
 4        4  38.8  
 5        5  37.4  
 6        6  22.4  
 7        7   4.20 
 8        8 -26.4  
 9        9 -31    
10       10 -35.4  
11       11 -22.4  
12       12 -22.3  
13       13  -0.733
14       14  15.5  
15       15  -0.400
16       16 NaN    
17       17 NaN    
18       18 NaN    
19       19 NaN    
20       20 NaN    

1 Ответ

2 голосов
/ 02 апреля 2020

Я подозреваю, что метод data.table может быть быстрее.

library(data.table)
setDT(df)
df[,c("roll.position","rollmean") := lapply(.SD,frollmean,n=5,fill=NA, align = "left")]
df[, result := rollmean[.I] - rollmean[.I + 5]]
df[,.(position,value,rollmean,result)]
#    position value rollmean result
# 1:        1    27     46.0  -15.8
# 2:        2    37     57.8    9.4
# 3:        3    57     69.8   37.6
# 4:        4    89     70.8   38.8
# 5:        5    20     64.6   37.4
# 6:        6    86     61.8   22.4
# 7:        7    97     48.4    4.2
# 8:        8    62     32.2  -26.4
# 9:        9    58     32.0  -31.0
#10:       10     6     27.2  -35.4
#11:       11    19     39.4  -22.4
#12:       12    16     44.2     NA
#13:       13    61     58.6     NA
#14:       14    34     63.0     NA
#15:       15    67     62.6     NA
#16:       16    43     61.8     NA
#17:       17    88       NA     NA
#18:       18    83       NA     NA
#19:       19    32       NA     NA
#20:       20    63       NA     NA

Данные

RNGkind(sample.kind = "Rounding")
set.seed(1); df <- data.frame( position = 1:20,value = sample(seq(1,100), 20))
RNGkind(sample.kind = "default")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...