Оператор OR в dplyr для расчета зависимой переменной - PullRequest
0 голосов
/ 01 октября 2018

Я хотел бы рассчитать одну переменную в зависимости от спецификации столбца.

example.df <- 
data.frame(trial.number = rep(1:10, 
each = 10), GY = sample(-200:200, 
100, replace = T), target.position 
= rep(c("up","down","up","down", 
"up"), each = 20))

test <- example.df %>% 
  group_by(trial.number) %>% 
  summarise(pxpos = 
max(GY[target.position == "up"]) | 
min(GY[target.position == "down"]))

Итак, если target.position "вверх", я хочу знать максимальный GY в этом испытании, когдаtarget.position = "down", я хочу, чтобы переменная принимала min (GY).

Это, однако, не работает.Я верю, что это возможно, хотя!Спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Другое решение dplyr с использованием данных, предоставленных @Ronak Shah:

example.df %>%
  group_by(trial.number) %>%
  mutate(res = ifelse(target.position == "up", max(GY),
                      ifelse(target.position == "down", min(GY), NA))) %>%
  summarise(res = first(res))

  trial.number   res
          <int> <dbl>
 1            1  177.
 2            2  183.
 3            3 -142.
 4            4 -191.
 5            5  143.
 6            6  158.
 7            7 -162.
 8            8 -200.
 9            9  194.
10           10  113.
0 голосов
/ 01 октября 2018

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

example.df %>%
  group_by(trial.number) %>%
  summarise(pxpos = case_when(first(target.position) == "up" ~ max(GY), 
                   TRUE ~ min(GY)))
# A tibble: 10 x 2
#   trial.number pxpos
#            <int> <dbl>
#1            1   177
#2            2   183
#3            3  -142
#4            4  -191
#5            5   143
#6            6   158
#7            7  -162
#8            8  -200
#9            9   194
#10          10   113
0 голосов
/ 01 октября 2018

Предполагая, что у вас всегда будет одно и то же значение в target.position в каждом trial.numer, мы можем group_by trial.number и рассчитать max(GY), если первое значение "вверх", или же вычислить min.

library(dplyr)

example.df %>%
    group_by(trial.number) %>%
    summarise(pxpos = if_else(target.position[1] == "up", max(GY), min(GY)))



#   trial.number pxpos
#          <int> <dbl>
# 1            1   177
# 2            2   183
# 3            3  -142
# 4            4  -191
# 5            5   143
# 6            6   158
# 7            7  -162
# 8            8  -200
# 9            9   194
#10           10   113

Как указал @Axeman, if_else медленный, вместо этого мы можем заменить его простым if else

example.df %>%
   group_by(trial.number) %>%
   summarise(pxpos = if (target.position[1] == "up")  max(GY) else min(GY))

данные

set.seed(123)
example.df <- data.frame(trial.number = rep(1:10, each = 10), 
             GY = sample(-200:200,100, replace = T), 
             target.position = rep(c("up","down","up","down", 
                 "up"), each = 20))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...