Поиск по условной группировке и логике? - PullRequest
0 голосов
/ 15 сентября 2018

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

df<-data.frame(ID=c("A","A","A","B","B","B","C","C","C"),
Week=c(1,2,3,1,2,3,1,2,3),
Variable=c(30,25,27,42,44,45,30,50,19))



  ID Week Variable
1  A    1       30
2  A    2       25
3  A    3       27
4  B    1       42
5  B    2       44
6  B    3       45
7  C    1       30
8  C    2       50
9  C    3       19

Как мне найти среднюю переменную на неделе 2 для всех идентификаторов, у которых переменная = 30 на неделе 1?

Например, я хотел бы, чтобы вывод в этом примере = 37,5

Ответы [ 3 ]

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

Шаг 1: Получите идентификаторы, которые имели переменную = 30 в неделю1

res<-  subset( df,Variable==30 & Week==1, ID ) 

Вывод:

> res
  ID
1  A
7  C

Шаг 2: Получить все их переменные на неделе 2:

dt<-subset(df,ID %in% as.vector(unlist(res))  & Week==2  ,select=c(ID,Variable))

Вывод:

  ID Variable
2  A       25
8  C       50

Шаг 3: Получите среднее значение:

  mean(dt$Variable)

Окончательный результат:

37.5

На шаге 2 мы имеем ID %in% as.vector(unlist(res)). Итак, что это значит?

% in% part просто является оператором, который возвращает true, если находит идентификатор внутри правого бокового вектора. Например,запустите приведенный ниже пример:

  a<- 1:10

  b<-c(0,4,6,8,16)

  b %in% a

и получите результат:

FALSE  TRUE  TRUE  TRUE FALSE

Итак, оператор% in% возвращает логическое значение для каждого элемента b. Результатом будет True, если этот элемент существует в a, в противном случае возвращается False .Как вы видите, 0 и 16 имеют значение False.

Но дело в том, что a должно быть вектором, в то время как res является data.frame, поэтому мне нужно сначала unlist его, а затемрассмотрим его как vector (as.vector).

В заключение ID %in% as.vector(unlist(res)) проверяет, существует ли каждый идентификатор в res или нет.

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

Это может быть легче читать / видеть.

library(tidyverse)

df %>% 
  spread(Week, Variable) %>%
  filter(`1` == 30) %>%
  with(mean(`2`))

[1] 37.5

Я думаю, tidyverse код легче понять, потому что вы можете читать его слева направо, как если бы вы использовали любой не кодовый текст. А конвейер %>% облегчает просмотр порядка операций, больше не нужно разбирать скобки.

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

Сначала нам нужно ID, которые имеют запись для variable=30 AND week=1, а затем из этого ID извлечения ID с Week=2 и сделать avg(Variable)

Base RРешение:

mean(df[df$ID %in% (df[df$Week==1 & df$Variable==30,1]) & df$Week==2,3])

Выход:

[1] 37.5

ИЛИ (другой подход)

Использование sqldf:

library(sqldf)
sqldf("select avg(Variable) from df where ID IN (select ID from df where variable=30 AND week=1) AND Week=2")

Вывод:

    avg(Variable)
1          37.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...