Как я могу определить первую строку со значением ниже, чем первая строка в другом столбце в группах в R? - PullRequest
1 голос
/ 14 июля 2020

У меня есть набор данных, который выглядит следующим образом:

   unique score value day
1       2    52 33.75   1
2       2    39 36.25   2
3       3    47 41.25   1
4       3    26 41.00   2
5       3    17 32.25   3
6       3    22 28.00   4
7       3    11 19.00   5
8       3     9 14.75   6
9       3    20 15.50   7
10      4    32 18.00   1
11      4    20 20.25   2
12      5    32 26.00   1
13      5    31 28.75   2
14      5    25 27.00   3
15      5    27 28.75   4
16      6    44 31.75   1
17      6    25 30.25   2
18      6    31 31.75   3
19      6    37 34.25   4
20      6    28 30.25   5

Я хотел бы указать первую строку в каждой группе (unique), где score ниже, чем value на day 1.

Я пробовал это:

result<-df %>% 
group_by(unique.id) %>% 
filter(dailyMyoActivity < globaltma[globalflareday==1])

Но, похоже, он не делает именно то, что я хочу. Есть ли способ сделать это?

Ответы [ 4 ]

0 голосов
/ 14 июля 2020

Мы также можем использовать slice

library(dplyr)
df1 %>%
   group_by(unique) %>%
   slice(which(score < value[day == 1])[1])
# A tibble: 3 x 4
# Groups:   unique [3]
#  unique score value   day
#   <int> <int> <dbl> <int>
#1      3    26  41       2
#2      5    25  27       3
#3      6    25  30.2     2

данные

df1 <- structure(list(unique = c(2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L), score = c(52L, 39L, 
47L, 26L, 17L, 22L, 11L, 9L, 20L, 32L, 20L, 32L, 31L, 25L, 27L, 
44L, 25L, 31L, 37L, 28L), value = c(33.75, 36.25, 41.25, 41, 
32.25, 28, 19, 14.75, 15.5, 18, 20.25, 26, 28.75, 27, 28.75, 
31.75, 30.25, 31.75, 34.25, 30.25), day = c(1L, 2L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 1L, 2L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 5L)), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20"))
0 голосов
/ 14 июля 2020

Если я правильно понял ваше обоснование, и если ваш набор данных уже упорядочен по day, это dplyr решение может пригодиться

library(dplyr)

df %>% 
  group_by(unique) %>% 
  filter(score < value[day==1]) %>% 
  slice(1)

Вывод

# A tibble: 3 x 4
# Groups:   unique [3]
#   unique score value   day
#    <int> <int> <dbl> <int>
# 1      3    26  41       2
# 2      5    25  27       3
# 3      6    25  30.2     2
0 голосов
/ 14 июля 2020

Учитывая, что вы запросили идентификацию первой строки, которая удовлетворяет критерию score < value, был добавлен новый столбец, в котором указан номер строки.

   result <- df %>% 
    mutate(row_nr = row_number()) %>% 
    group_by(unique) %>% 
    filter(score < value) %>% 
    slice(1)
0 голосов
/ 14 июля 2020

Это может помочь:

library(dplyr)

df %>% group_by(unique) %>% mutate(Index=ifelse(score<value & day==1,1,0))

# A tibble: 20 x 5
# Groups:   unique [5]
   unique score value   day Index
    <int> <int> <dbl> <int> <dbl>
 1      2    52  33.8     1     0
 2      2    39  36.2     2     0
 3      3    47  41.2     1     0
 4      3    26  41       2     0
 5      3    17  32.2     3     0
 6      3    22  28       4     0
 7      3    11  19       5     0
 8      3     9  14.8     6     0
 9      3    20  15.5     7     0
10      4    32  18       1     0
11      4    20  20.2     2     0
12      5    32  26       1     0
13      5    31  28.8     2     0
14      5    25  27       3     0
15      5    27  28.8     4     0
16      6    44  31.8     1     0
17      6    25  30.2     2     0
18      6    31  31.8     3     0
19      6    37  34.2     4     0
20      6    28  30.2     5     0

Затем вы фильтруете по Index==1

...