Цикл в R, чтобы найти предыдущий матч - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужна помощь, чтобы написать функцию цикла в R. У меня возникла проблема с выбором предыдущего совпадения при совпадении идентификатора, а затем написать OLD_RANK столбец и NEW_RANK столбец.

OLD_RANK должно быть NEW_RANK предыдущего найденного совпадения.

`NEW_RANK`<- OLD_RANK+0.05(S1-S2)

Вот мои данные для этого примера

JUNK<- matrix(c(1,1,10,20,3,2,30,40,1,3,60,4,3,
4,5,40,1,5,10,30,7,6,20,20),ncol=4,byrow=TRUE)
colnames(JUNK) <- c("ID1","DAY","S1","S2")
JUNK<- as.data.frame(JUNK)

То, что я считал хорошим началом:

#subset to find previous match. Find matches before days and if more matches are 
#found, choose the row with higher values in `days`
loop for each row
s1 <- subset(s1, DAYS < days)
s1 <- subset(s1, DAYS = max(days))

#if no match fuond JUNK$OLD_RANK<-35 and JUNK$NEW_RANK <-JUNK$OLD_RANK+0.05(S1-S2)
#if previous match is found JUNK$NEW_RANK <-JUNK$OLD_RANK+0.05(S1-S2)

ожидаемый результат:

ID1    DAYS    S1     S2     OLD_RANK   NEW_RANK
1        1     10      20      35        34.5
3        2     30      40      35        34.5
1        3     60      4       34.5      37.3
3        4     5       40      34.5      32.75
1        5     10      30      37.3      36.3
7        6     20      20      35        35

Любая помощь приветствуется.

1 Ответ

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

Вот один из подходов:

library(dplyr)
JUNK2 <- JUNK %>%
  group_by(ID1) %>%
  mutate(change   = 0.05*(S1-S2),
         NEW_RANK = 35 + cumsum(change),
         OLD_RANK = lag(NEW_RANK) %>% if_else(is.na(.), 35, .)) %>%
  ungroup()   # EDIT: Added to end with ungrouped table

Результат:

JUNK2
# A tibble: 6 x 7
    ID1   DAY    S1    S2 change NEW_RANK OLD_RANK
  <dbl> <dbl> <dbl> <dbl>  <dbl>    <dbl>    <dbl>
1     1     1    10    20  -0.5      34.5     35  
2     3     2    30    40  -0.5      34.5     35  
3     1     3    60     4   2.8      37.3     34.5
4     3     4     5    40  -1.75     32.8     34.5
5     1     5    10    30  -1        36.3     37.3
6     7     6    20    20   0        35       35  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...