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
from
data.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)