这是此文章的后续内容 R Printing ftable() output to csv with factor names 还将在此处包括背景。
我有一些人口普查数据,人们可以将他们的种族列为一种或多种不同种族的组合。我们允许他们从这些选择中进行选择。
美洲印第安人
东亚
太平洋岛民
黑人或非裔美国人
白人或白人
西班牙裔或拉丁裔/ a
南亚人
中东
其他
如果要制作人种的列联表,结果数据将非常混乱,因为我在下面提供了一个示例,其中的数据输出可以将一个人列出许多不同的种族。
structure(list(Race = structure(c(3L, 2L, 3L, 9L, 9L, 11L,
5L, 11L, 3L, 3L, 3L, 3L, 7L, 3L, 11L, 5L, 9L, 10L, 9L, 10L, 2L,
3L, 2L, 6L, 9L, 10L, 3L, 10L, 8L, 3L, 5L, 1L, 2L, 9L, 4L, 3L), .Label = c("Black or African American",
"Black or African American,White or Caucasian", "East Asian",
"East Asian,Pacific Islander", "Hispanic or Latino/a", "Other",
"Pacific Islander", "South Asian", "White or Caucasian", "White or Caucasian,Hispanic or Latino/a",
"White or Caucasian,Middle Eastern"), class = "factor")), class = "data.frame", row.names = c(NA,
-36L))
为了减少因素的数量,我将一个单元中所有具有多个种族的人(使用上一篇文章中描述的方法)设置为“混合”。就像上述数据框中的一个单元格所说的“白人或白人,中东”变成了“混合”。但是,我想进一步探索我变成“混合”人群的人口统计信息。我想做的是创建一个数据框,其中人作为一行,每个不同种族作为一列。然后,如果该人将自己列为任何种族,则该种族列将为1。如果未将其列为该种族,则该列将为0。例如,如果某人将自己列为“白人”和“东亚人” ”他们在数据框中的行将如下所示
答案 0 :(得分:2)
可以尝试:
library(tidyverse)
df %>%
mutate(ID = row_number(), dummy = 1) %>%
separate_rows(Race, sep = ",") %>%
spread(Race, dummy, fill = 0)
请注意,由于没有ID
,因此我创建了一个等于行号的
输出:
ID Black or African American East Asian Hispanic or Latino/a Middle Eastern Other Pacific Islander
1 1 0 1 0 0 0 0
2 2 1 0 0 0 0 0
3 3 0 1 0 0 0 0
4 4 0 0 0 0 0 0
5 5 0 0 0 0 0 0
6 6 0 0 0 1 0 0
7 7 0 0 1 0 0 0
8 8 0 0 0 1 0 0
9 9 0 1 0 0 0 0
10 10 0 1 0 0 0 0
11 11 0 1 0 0 0 0
12 12 0 1 0 0 0 0
13 13 0 0 0 0 0 1
14 14 0 1 0 0 0 0
15 15 0 0 0 1 0 0
16 16 0 0 1 0 0 0
17 17 0 0 0 0 0 0
18 18 0 0 1 0 0 0
19 19 0 0 0 0 0 0
20 20 0 0 1 0 0 0
21 21 1 0 0 0 0 0
22 22 0 1 0 0 0 0
23 23 1 0 0 0 0 0
24 24 0 0 0 0 1 0
25 25 0 0 0 0 0 0
26 26 0 0 1 0 0 0
27 27 0 1 0 0 0 0
28 28 0 0 1 0 0 0
29 29 0 0 0 0 0 0
30 30 0 1 0 0 0 0
31 31 0 0 1 0 0 0
32 32 1 0 0 0 0 0
33 33 1 0 0 0 0 0
34 34 0 0 0 0 0 0
35 35 0 1 0 0 0 1
36 36 0 1 0 0 0 0
South Asian White or Caucasian
1 0 0
2 0 1
3 0 0
4 0 1
5 0 1
6 0 1
7 0 0
8 0 1
9 0 0
10 0 0
11 0 0
12 0 0
13 0 0
14 0 0
15 0 1
16 0 0
17 0 1
18 0 1
19 0 1
20 0 1
21 0 1
22 0 0
23 0 1
24 0 0
25 0 1
26 0 1
27 0 0
28 0 1
29 1 0
30 0 0
31 0 0
32 0 0
33 0 1
34 0 1
35 0 0
36 0 0
答案 1 :(得分:1)
首先,您需要将单列拆分为多列(我强烈建议您避免使用以下因素:
dfdat <- read.table(text=as.character(dat[[1]][-1]), sep=",",
fill=TRUE, stringsAsFactors=FALSE)
运行将按行应用于值(当然也将转置以恢复原始尺寸:
dftbl <- t( apply(dfdat, 1, function(x){ 0+ # adding zero to logical coerces to numeric
c( 'American Indian',
'East Asian',
'Pacific Islander',
'Black or African American',
'White or Caucasian',
'Hispanic or Latino/a',
'South Asian',
'Middle Eastern',
'Other') %in% x}))
dftbl
#===================
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 0 0 1 1 0 0 0 0
[2,] 0 1 0 0 0 0 0 0 0
[3,] 0 0 0 0 1 0 0 0 0
[4,] 0 0 0 0 1 0 0 0 0
[5,] 0 0 0 0 1 0 0 1 0
[6,] 0 0 0 0 0 1 0 0 0
然后只需转换为data.frame,重新添加列名的向量,然后使用any
函数绑定到apply的应用程序。