Как использовать мутирование итеративно по нескольким строкам в r - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь рассчитать процентную разницу в ht между всеми возможными парами данных для каждой группы лиц, а также разницу во времени между показателями ht. Это мои данные:

hc1<- data.frame(id= c(1,1,1,2,2,2,3,3),
                  testoccasion= c(1,2,3,1,2,3,1,2),
                  ht= c(0.2,0.1,0.8,0.9,1.0,0.5,0.4,0.8),
                  time= c(5,4,8,5,6,5,2,1))

Это мой код.

library(dplyr)
a<-hc1 %>% 
   group_by(id) %>% 
   arrange(id,testoccasion) %>% 
   mutate(fd = (ht-lag(ht))/lag(ht)*100) %>% 
   mutate(t = time-lag(time))
b<-hc1 %>% 
   group_by(id) %>% 
   arrange(id,testoccasion) %>% 
   mutate(fd = (ht-lag(ht,2))/lag(ht,2)*100) %>% 
   mutate(t = time-lag(time,2))
c<-hc1 %>% 
   group_by(id) %>% 
   arrange(id,testoccasion) %>% 
   mutate(fd = (ht-lag(ht,3))/lag(ht,3)*100) %>% 
   mutate(t = time-lag(time,3))

diff<-rbind(a,b,c)
diff<-na.omit(diff)

Мне любопытно, как я могу сделать этот код короче. Я хочу, чтобы можно было найти разницу по всем возможным парам ht для всех тестовых случаев, где количество тестовых тестов различается для отдельных идентификаторов. Было бы здорово, если бы мне не приходилось делать это итеративно, как это, потому что это огромный набор данных, который у меня есть. Спасибо!

1 Ответ

0 голосов
/ 07 сентября 2018

Мы можем использовать map для цикла n, используемого в lag

library(tidyverse)
map_df(1:3, ~ 
            hc1 %>%
                group_by(id) %>% 
                arrange(id, testoccasion) %>% 
                mutate(fd = (ht -lag(ht, .x))/lag(ht, .x) * 100,
                t = time -lag(time, .x)))  %>%
  na.omit
# A tibble: 7 x 6
# Groups:   id [3]
#     id testoccasion    ht  time     fd     t
#  <dbl>        <dbl> <dbl> <dbl>  <dbl> <dbl>
#1     1            2   0.1     4  -50      -1
#2     1            3   0.8     8  700       4
#3     2            2   1       6   11.1     1
#4     2            3   0.5     5  -50      -1
#5     3            2   0.8     1  100      -1
#6     1            3   0.8     8  300.      3
#7     2            3   0.5     5  -44.4     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...