R 创建一个;交叉表;样式输出
我有一个示例数据集:R 创建一个;交叉表;样式输出,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一个示例数据集: id <- 1:100 gender <- sample(c('M','F'), 100, replace=TRUE) age <- sample(18:22, 100, replace=TRUE) ethnicity <- sample(c('W','B','H','A','O'), 100, replace = TRUE) grade <- sample(LETTERS[1:4], 100, replace=TRUE) df <-
id <- 1:100
gender <- sample(c('M','F'), 100, replace=TRUE)
age <- sample(18:22, 100, replace=TRUE)
ethnicity <- sample(c('W','B','H','A','O'), 100, replace = TRUE)
grade <- sample(LETTERS[1:4], 100, replace=TRUE)
df <- cbind(id,gender,age,ethnicity,grade) %>% as.data.frame()
因此,我想创建一行,将三个分类变量结合起来(例如:“22岁的拉美裔女性获得2 a、0 B、2 C等)。我只想通过每个性别、年龄和种族的等级分布来划分,但它们都在一列中
实现这一点的最佳方法是什么?使用
dplyr
和tidyr
我们可以获得长格式的数据,统计每个等级的每个值的出现次数,并以宽格式返回数据
library(dplyr)
library(tidyr)
df %>%
select(-id) %>%
pivot_longer(cols = -grade) %>%
count(value, grade) %>%
pivot_wider(names_from = grade, values_from = n)
# A tibble: 12 x 5
# value A B C D
# <fct> <int> <int> <int> <int>
# 1 F 8 10 12 13
# 2 M 13 18 11 15
# 3 18 2 4 7 6
# 4 19 5 6 4 4
# 5 20 3 6 3 8
# 6 21 6 5 5 3
# 7 22 5 7 4 7
# 8 A 5 3 1 5
# 9 B 5 5 6 7
#10 H 1 4 3 3
#11 O 3 10 7 7
#12 W 7 6 6 6
库(dplyr)
图书馆(tidyr)
df%>%
选择(-id)%%>%
枢轴长度(cols=-坡度)%>%
计数(值、等级)%>%
轴宽(名称从=等级,值从=n)
#一个tibble:12x5
#值A B C D
#
#1楼8 10 12 13
#2米13 18 11 15
# 3 18 2 4 7 6
# 4 19 5 6 4 4
# 5 20 3 6 3 8
# 6 21 6 5 5 3
# 7 22 5 7 4 7
#8 A 5 3 1 5
#9 B 5 6 7
#10H1433
#11O31077
#12西7 6 6
数据
set.seed(123)
id <- 1:100
gender <- sample(c('M','F'), 100, replace=TRUE)
age <- sample(18:22, 100, replace=TRUE)
ethnicity <- sample(c('W','B','H','A','O'), 100, replace = TRUE)
grade <- sample(LETTERS[1:4], 100, replace=TRUE)
df <- cbind(id,gender,age,ethnicity,grade) %>% as.data.frame()
set.seed(123)
id我们可以使用melt/dcast
fromdata.table
library(data.table)
dcast(melt(setDT(df[, -1]), id.var = 'grade'), value ~ grade, length)
# value A B C D
# 1: 18 2 4 7 6
# 2: 19 5 6 4 4
# 3: 20 3 6 3 8
# 4: 21 6 5 5 3
# 5: 22 5 7 4 7
# 6: A 5 3 1 5
# 7: B 5 5 6 7
# 8: F 8 10 12 13
# 9: H 1 4 3 3
#10: M 13 18 11 15
#11: O 3 10 7 7
#12: W 7 6 6 6
数据
set.seed(123)
我很好!还有一个问题:我有没有办法选择每一行每一列的顺序?现在是性别、年龄、种族,对吗?如果我想让它去,比如说年龄、种族、性别呢?@gooponyagrinch在pivot\u longer
的cols
参数中选择顺序,而不是pivot\u longer(cols=-grade)
使用…pivot_更长时间(cols=c(年龄、种族、性别))%>%…
或任何您想要的顺序。
library(data.table)
dcast(melt(setDT(df[, -1]), id.var = 'grade'), value ~ grade, length)
# value A B C D
# 1: 18 2 4 7 6
# 2: 19 5 6 4 4
# 3: 20 3 6 3 8
# 4: 21 6 5 5 3
# 5: 22 5 7 4 7
# 6: A 5 3 1 5
# 7: B 5 5 6 7
# 8: F 8 10 12 13
# 9: H 1 4 3 3
#10: M 13 18 11 15
#11: O 3 10 7 7
#12: W 7 6 6 6
set.seed(123)
id <- 1:100
gender <- sample(c('M','F'), 100, replace=TRUE)
age <- sample(18:22, 100, replace=TRUE)
ethnicity <- sample(c('W','B','H','A','O'), 100, replace = TRUE)
grade <- sample(LETTERS[1:4], 100, replace=TRUE)
df <- data.frame(id, gender, age, ethnicity, grade)