Как я могу преобразовать фрейм данных ответов на опрос в таблицу частот? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть R данных кадра результатов опроса.Каждый столбец является ответом на вопрос об опросе.Может принимать значения от 1 до 10 и NA.Я хотел бы превратить это в таблицу частот.

Это пример данных, которые у меня есть.Я притворяюсь, что значения идут от 1 до 3, а не от 1 до 10.

data.frame(
  "Person" = c(1,2,3),
  "Question1" = c(NA, "1", "1"),
  "Question2" = c("1", "2", "3")
)

Что я хочу:

data.frame(
  "Question" = c("Question1", "Question2"),
  "Frequency of 1" = c(2, 1),
  "Frequency of 2" = c(0 , 1),
  "Frequency of 3" = c(0, 1)
)

Я пытался использовать likert () из likertпакет, но я получаю дробные результаты, которые не могут быть правильными.Есть ли простое решение этой проблемы?

Ответы [ 4 ]

0 голосов
/ 10 февраля 2019

Другая возможность tidyverse может быть:

df %>%
 gather(Question, val, -Person, na.rm = TRUE) %>%
 group_by(Question, val) %>%
 summarise(res = length(val)) %>%
 ungroup() %>%
 mutate(val = paste0("Frequency.of.", val)) %>%
 spread(val, res, fill = NA)

  Question  Frequency.of.1 Frequency.of.2 Frequency.of.3
  <chr>              <int>          <int>          <int>
1 Question1              2             NA             NA
2 Question2              1              1              1

Здесь она, во-первых, преобразует данные из широкого в длинный формат.Во-вторых, он рассчитывает частоты в соответствии с вопросами.Наконец, он создает "Frequency.of."переменных и возвращает данные в желаемую форму.

Или, если вы хотите рассчитать также значения NA для вопросов:

df %>%
 gather(Question, val, -Person) %>%
 group_by(Question, val) %>%
 summarise(res = length(val)) %>%
 ungroup() %>%
 mutate(val = paste0("Frequency.of.", val)) %>%
 spread(val, res, fill = NA)

  Question  Frequency.of.1 Frequency.of.2 Frequency.of.3 Frequency.of.NA
  <chr>              <int>          <int>          <int>           <int>
1 Question1              2             NA             NA               1
2 Question2              1              1              1              NA
0 голосов
/ 10 февраля 2019

A data.table решение:

require(data.table)
setDT(df)    

# Melt data:
df <- melt(df, id.vars = "Person", value.name = "Question")

# Cast data to required structure:
df <- data.frame(dcast(df, variable ~ Question))

# Rename variables and remove NA count (as per Ops question):
names(df)[1] <- "Question"
names(df)[-1] <- gsub("X", "Frequency of ", names(df)[-1])
df$NA. <- NULL

df
#   Question Frequency of 1 Frequency of 2 Frequency of 3
#1 Question1              2              0              0
#2 Question2              1              1              1

Или ответ в одну строку:

dcast(melt(setDT(df), id.vars="Person", value.name="Question")[!Question %in% NA][, Question := paste0("Frequency of ", Question)], variable ~ Question)
0 голосов
/ 10 февраля 2019

Вот решение с использованием пакетов dplyr и purrr

library(dplyr)
library(purrr)

data.frame(
  "Person" = c(1,2,3),
  "Question1" = c(NA, "1", "1"),
  "Question2" = c("1", "2", "3")
)

df %>% 
  select(-Person) %>% 
  mutate_all(~ factor(.x, levels =  as.character(1:10) ) %>% addNA() ) %>% 
  map(table) %>% 
  transpose() %>% 
  map(as.integer) %>% 
  set_names( ~ paste0("Frequency of ",ifelse(is.na(.), "NA", .))) %>% 
  as_tibble() %>% 
  mutate(Question = setdiff(names(df),"Person")) %>% 
  select(Question,everything(), "Frequency of NA" = `Frequency of ` ) 
0 голосов
/ 10 февраля 2019

Это не самое элегантное, но может помочь: df2 - ваш набор данных.Данные:

   df2<-data.frame(
  "Person" = c(1,2,3),
  "Question1" = c(NA, "1", "1"),
  "Question2" = c("1", "2", "3"),stringsAsFactors = F
)

Цель: РЕДАКТИРОВАТЬ :: Вы можете "автоматизировать" следующим образом

df2[is.na(df2)]<-0 #To allow numeric manipulation
values<-c("1","2","3")
    Final_df<-sapply(values,function(val) apply(df2[,-1],2,function(x) sum(x==val)))
    Final_df<-as.data.frame(Final_df)
    names(Final_df)<-paste0("Frequency of_",1:ncol(Final_df))

Это дает:

             Frequency of_1          Frequency of_2          Frequency of_3
Question1              2                0                    0
Question2              1                1                    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...