转置数据集并计算出现次数

时间:2019-06-07 12:43:35

标签: r dataframe data-manipulation

原始数据集包含长格式的调查数据

原始数据集

T Q1  Q2  Q3    
M1 3 5 4  
M1 3 1 3  
M1 1 3 1  
M2 4 4 2  
M2 2 2 3  
M2 5 5 5

其中 T 是受访者的类型,而 Q1-Q3 是问题,并且单元格值对应于他们在 1上的一致程度- 5 李克特 规模。

想要的数据集

T Q A1 A2 A3 A4 A5  
M1 Q1 1 0 3 0 0  
M2 Q1 0 1 0 1 1  
M1 Q2 1 0 1 0 1  
M2 Q2 0 1 0 1 1  
M1 Q3 1 0 1 1 0  
M2 Q3 0 1 1 0 1

其中 A1-A5 是可能的答案(1--5 Likert),单元格值包含每个组M1和M2的这些答案的频率。

如何从原始数据集所需数据集

2 个答案:

答案 0 :(得分:2)

一种方法是使用dplyr和tidyr

library(dplyr)
library(tidyr)

df <- data.frame(Type = c('M1', 'M1', 'M1', 'M2', 'M2', 'M2'),
           Q1 = c(3, 3, 1, 4, 2, 5),
           Q2 = c(5, 1, 3, 4, 2, 5),
           Q3 = c(4, 3, 1, 2, 3, 5))

df %>%
  gather(key = 'Q', value = 'A', -Type) %>%
  group_by(Type, Q, A) %>%
  summarize(Count = n()) %>%
  mutate(A = paste0('A', A)) %>%
  spread(key = A, value = Count, fill = 0) %>%
  arrange(Q, Type)

答案 1 :(得分:1)

我使用了tidyverse功能来解决您的问题。请注意,我必须创建行标识符,因为并非总是收集扩展名是对称的(有关更多信息,请查看this

library(tidyverse)

# Data
x <- data.frame(
  T = c("M1", "M1", "M1", "M2", "M2", "M2"),
  Q1 = c(3, 3, 1, 4, 2, 5),
  Q2 = c(5, 1, 3, 4, 2, 5),
  Q3 = c(4, 3, 1, 2, 3, 5)
)


# Modification
gather(x, key, A, -T) %>%
  group_by(T, key, A) %>%
  mutate(row_id = 1:n()) %>%
  ungroup() %>%
  spread(A, A, fill = 0, sep = "") %>%
  select(-row_id)