探索R中的综合因素

时间:2019-03-03 20:55:24

标签: r

这是此文章的后续内容 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。例如,如果某人将自己列为“白人”和“东亚人” ”他们在数据框中的行将如下所示

enter image description here

2 个答案:

答案 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的应用程序。