创建列出不同观察结果的列
Creating column that lists distinct observations
我有一个观察数据框架,看起来像这样(显示每个学期开设的大学 类 的课程编号)。列很长,长度不一
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
任何建议或相关帖子的链接将不胜感激!谢谢!
在 base R
中,一个选项是 stack
将 data.frame 放入两列数据集并使用 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
中,我们可以使用 pivot_longer
重塑为 'long' 格式,获取 count
并重塑为 'wide
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
数据
df1 <- structure(list(spring = c("4a", "4a", "7c"), summer = c("5b",
"9c", "5b"), fall = c("5c", "11b", "8a")), class = "data.frame", row.names = c(NA,
-3L))
您可以通过收集数据然后使用 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)
我有一个观察数据框架,看起来像这样(显示每个学期开设的大学 类 的课程编号)。列很长,长度不一
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
任何建议或相关帖子的链接将不胜感激!谢谢!
在 base R
中,一个选项是 stack
将 data.frame 放入两列数据集并使用 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
中,我们可以使用 pivot_longer
重塑为 'long' 格式,获取 count
并重塑为 'wide
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
数据
df1 <- structure(list(spring = c("4a", "4a", "7c"), summer = c("5b",
"9c", "5b"), fall = c("5c", "11b", "8a")), class = "data.frame", row.names = c(NA,
-3L))
您可以通过收集数据然后使用 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)