Синтаксис Tidyr для замены запросов sqldf - PullRequest
1 голос
/ 03 мая 2019

У меня есть данные, как показано ниже, которые я хочу сделать предварительный анализ:

selected <- c("1", "1", "1", "0", "1", "0", "0", "1", "0", "0", NA)
teammember1 <- c("M", "M", "F", "M", "M", "F", "M", "M", "M", "F", "M")
teammember2 <- c("M", "M", "M", "M", "M", "M", "M", "F", "M", "F", "F")
teammember3 <- c("M", "M", "", "", "", "", "M", "", "M", "F", "")
selection <- data.frame(teammember1, teammember2, teammember3, selected)

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

Я использовал sqldf запросов, как показано ниже:

 library(sqldf)
  selectcomp <- sqldf("SELECT  *
                  FROM selection
                  WHERE  selected NOT NULL
                  ")
      selectcomp
      countnotNull <- dplyr::count(selectcomp)

    withF <- sqldf("SELECT  *
                  FROM selectcomp
                  WHERE  (teammember1 LIKE '%F%'
                  OR teammember2 LIKE '%F%'
                  OR teammember3 LIKE '%F%')
                  AND selected LIKE '%1%'
                  ")

   onlyM <- sqldf("SELECT  *
                  FROM selectcomp
                  WHERE  (teammember1 NOT LIKE '%F%'
                  AND teammember2 NOT LIKE '%F%'
                  AND teammember3 NOT LIKE '%F%')
                  AND selected LIKE '%1%'
                 ")
  countwithF <- dplyr::count(withF)
  countonlyM <- dplyr::count(onlyM)

  probwithF <- (countwithF/countnotNull)*100
  probonlyM <- (countonlyM/countnotNull)*100

  comparison <- data.frame(probwithF, probonlyM)
  comparison
  colnames(comparison) <- c("probwithF", "probonlyM")

 library(tidyr)
 comparison <- comparison %>% 
 tidyr::gather(type, prob) 
 comparison

Как будет выглядеть схема, использующая тидир и Magrittr труба (%>%) полностью?

1 Ответ

1 голос
/ 03 мая 2019

Вы можете воспроизвести желаемый результат, используя стиль tidyverse следующим образом:

selection %>% 
  mutate(selected = as.numeric(as.character(selected))) %>%
  mutate(team_type = if_else((teammember1=="F" | teammember2=="F" |teammember3=="F"),
                             "Team with F","Team without F")) %>% 
  group_by(team_type) %>% 
  summarise(probabilty = mean(selected, na.rm=TRUE))

Вероятность «Команда с F» составляет 20%, потому что 2 из 10 команд, для которых у вас есть соответствующая информацияпомечены как выбранные И имеют по крайней мере одну женщину в команде.

Но действительно ли это то, что вы хотите знать?Я поняла, что вам нравится знать вероятность выбора, учитывая, что в вашей команде есть или нет женщина.Тогда ваш код будет:

selection %>% 
  mutate(selected = as.numeric(as.character(selected))) %>%
  mutate(count_not_na = sum(!is.na(selected))) %>%
  mutate(team_type = if_else((teammember1=="F" | teammember2=="F" |teammember3=="F"), 
                             "Team with F","Team without F")) %>% 
  group_by(team_type) %>% 
  summarise(probabilty = sum(selected/count_not_na, na.rm=TRUE))

Вероятность «Команда с F» теперь составляет 50%, потому что 2 из 4 команд с участием женщин и информацией о статусе выбора фактически отмечены как выбранные.

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