Мутировать по группе на основе условного - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь добавить сводный столбец в фрейм данных. Хотя суммарная статистика c должна быть применена к каждому столбцу, сама статистика c должна рассчитываться только на основе условных строк.

В качестве примера, приведенного для этого кадра данных:

x <- data.frame(usernum=rep(c(1,2,3,4),each=3),
                final=rep(c(TRUE,TRUE,FALSE,FALSE)),
                time=1:12)

Я хотел бы добавить столбец usernum.mean, но где среднее значение рассчитывается только при final=TRUE. Я пытался:

library(tidyverse)

x %>% 
  group_by(usernum) %>%
  mutate(user.mean = mean(x$time[x$final==TRUE]))

, но это дает общее среднее значение, а не по пользователю. Я также попытался:

x %>% 
  group_by(usernum) %>%
  filter(final==TRUE) %>% 
  mutate(user.mean = mean(time))

, но при этом возвращается только отфильтрованный фрейм данных:

# A tibble: 6 x 4
# Groups:   usernum [4]
  usernum final  time user.mean
    <dbl> <lgl> <int>     <dbl>
1       1 TRUE      1       1.5
2       1 TRUE      2       1.5
3       2 TRUE      5       5.5
4       2 TRUE      6       5.5
5       3 TRUE      9       9  
6       4 TRUE     10      10 

Как применить эти средства к каждой исходной строке?

1 Ответ

2 голосов
/ 28 января 2020

Если мы используем x$ после group_by, он возвращает весь столбец, а не только значения в этой конкретной группе. Во-вторых, TRUE/FALSE является логическим вектором, поэтому нам не нужно ==

library(dplyr)
x %>%
     group_by(usernum) %>% 
     mutate(user.mean = mean(time[final]))

Единственный вариант, в котором мы можем использовать $, это .data

x %>% 
    group_by(usernum) %>%
    mutate(user.mean = mean(.data$time[.data$final]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...