创建列出不同观察结果的列

时间:2020-01-02 20:41:12

标签: r categorical-data

我有一个类似这样的观察数据框架(显示每个学期提供的大学课程的课程号)。列很长,长度各不相同

  spring   summer   fall
   4a       5b       5c
   4a       9c       11b
   7c       5b       8a 
   ...      ...      ...

我想重新格式化它,使其看起来像这样。首先,我想创建一列“ Course_Names”,该列显示可能提供的不同课程的所有名称。然后,我想计算每个学期开设的每门课程的科数。

   Course_Names   spring   summer   fall
   4a             2        0        0
   5b             0        2        0
   5c             0        0        1
   7c             1        0        0
   8a             1        0        1
   9c             0        1        0
   11b            0        0        1        

任何建议或相关帖子的链接将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:6)

base R中,一种选择是将{.1}的data.frame分为两列数据集并使用stack

table

或者在table(stack(df1)) # ind #values spring summer fall # 11b 0 0 1 # 4a 2 0 0 # 5b 0 2 0 # 5c 0 0 1 # 7c 1 0 0 # 8a 0 0 1 # 9c 0 1 0 中,我们可以使用tidyverse重塑为'long'格式,得到pivot_longer并重塑为'wide

count

数据

library(dplyr)
library(tidyr)
df1 %>%
    pivot_longer(everything()) %>%
    count(name, Course_Names = value) %>%
    pivot_wider(names_from = name, values_from = n, values_fill = list(n = 0))
# A tibble: 7 x 4
#  Course_Names  fall spring summer
#  <chr>        <int>  <int>  <int>
#1 11b              1      0      0
#2 5c               1      0      0
#3 8a               1      0      0
#4 4a               0      2      0
#5 7c               0      1      0
#6 5b               0      0      2
#7 9c               0      0      1

答案 1 :(得分:3)

您可以这样做,方法是收集数据,然后使用tidyr软件包中的那些函数再次分发它们,如下所示;

library(dplyr)
library(tidyr)

data <-
  data.frame(
    spring = c("4a", "4a", "7c"),
    summer = c("5b", "9c", "5b"),
    fall = c("5c", "11b", "8a")
  )

result <-
  data %>%
  gather(key = "Course_Names", value = "Course") %>%
  group_by(Course_Names, Course) %>%
  count() %>%
  spread(key = Course_Names, value = n) %>%
  replace(is.na(.), 0)