R: Объединение четырех переменных в одну - PullRequest
0 голосов
/ 15 января 2020

У меня есть 4 переменные (расы, asian_news, black_news, nhpi_news и latino_news).

'Расы' - это фактор с 6 уровнями: белые, азиаты, NHPI, черные, латиноамериканцы, многорасовые.

'asian_news', 'black_news', 'nhpi_news' и 'latino_news' - это серия вопросов опроса, которые имеют 4 результата: [1] ethni c, [2] mainstream, [3] оба и [4] DK.

Эти вопросы задают респондентам, получают ли они в основном свои новости из этни c источников или через основные средства массовой информации США. Эти вопросы опроса работают следующим образом:

  • задается только группа азиатских американцев asian_news
  • задается только NHPI nhpi_news
  • только латиноамериканцы задаются latino_news
  • только для черных. Black_news

Данные репликации можно скачать здесь:

library(foreign)
pre<-read.csv("https://www.dropbox.com/s/wzitbwr6q2i26gt/sampledata.csv?dl=1")

На данный момент кросс-таблица между расами и asian_news выглядит следующим образом:

 > with(pre,table(races,asian_news,useNA="always"))
                                   asian_news
races                           ethnic mainstream both  DK <NA>
  3. WHITES                          0          0    0   0  500
  1. ASIAN AMERICANS               770        863  294  41  142
  2. PACIFIC ISLANDERS               0          0    0   0  410
  4.BLACKS OR AFRICAN AMERICANS      0          0    0   0  520
  6. latinos                         0          0    0   0  514
  9. MULTIRACIAL AMERICANS           0          0    0   0    0
  <NA>                               0          0    0   0    0

Аналогично, кросс-таблица между расами и black_news выглядит следующим образом:

> with(pre,table(races,black_news,useNA="always"))
                               black_news
races                           ethnic mainstream both   DK <NA>
  3. WHITES                          0          0    0    0  500
  1. ASIAN AMERICANS                 0          0    0    0 2110
  2. PACIFIC ISLANDERS               0          0    0    0  410
  4.BLACKS OR AFRICAN AMERICANS     53        366   67   12   22
  6. latinos                         0          0    0    0  514
  9. MULTIRACIAL AMERICANS           0          0    0    0    0
  <NA>                               0          0    0    0    0

Можно создать аналогичные кросс-таблицы со следующими кодами:

with(pre,table(races,latino_news,useNA="always"))
with(pre,table(races,nhpi_news,useNA="always"))

Я хочу объединить эти четыре вопроса опроса в единую переменную. В идеале, кросс-таблицы между расами и желаемой переменной должны выглядеть следующим образом

> with(pre,table(races,desired_variable,useNA="always"))
                               desired_variable
races                           ethnic mainstream both   DK <NA>
  3. WHITES                          0        500    0    0    0
  1. ASIAN AMERICANS               770        863  294   41  142
  2. PACIFIC ISLANDERS              22        332   24   13   19
  4.BLACKS OR AFRICAN AMERICANS     53        366   67   12   22
  6. latinos                       142        302   47    1   22 
  9. MULTIRACIAL AMERICANS           0          0    0    0    0
  <NA>                               0          0    0    0    0

Как мне сгенерировать переменную «required_variable»? Большое спасибо заранее.

1 Ответ

0 голосов
/ 16 января 2020

Это решение tidyr & magrittr может работать для:

pre<-read.csv("https://www.dropbox.com/s/wzitbwr6q2i26gt/sampledata.csv?dl=1")

library(magrittr)
library(tidyr)

pre %>% 
  pivot_longer(cols = contains('news'), names_to = 'ethnicNews') %$%
  table(races, value,useNA = 'always')
#>                                 value
#> races                            both   DK ethnic mainstream <NA>
#>   1. ASIAN AMERICANS              324   53    825       1401 8545
#>   2. PACIFIC ISLANDERS             24   13     22        332 1249
#>   3. WHITES                         0    0      0          0 2004
#>   4. BLACKS OR AFRICAN AMERICANS   36    5     24        163  716
#>   5. BLACKS OR AFRICAN AMERICANS   31    7     29        203  866
#>   6. latinos                       47    1    142        302 1564
#>   9. MULTIRACIAL AMERICANS          0    0      0          0  220
#>   <NA>                              0    0      0          0    0

И, используя recode из dplyr, вы можете удалить эту ненужную двойную запись:

pre<-read.csv("https://www.dropbox.com/s/wzitbwr6q2i26gt/sampledata.csv?dl=1")

library(magrittr)
library(tidyr)
library(dplyr)

pre %>% 
  pivot_longer(cols = contains('news'), names_to = 'ethnicNews') %>% 
  mutate(races = recode(races,'5. BLACKS OR AFRICAN AMERICANS' = '4. BLACKS OR AFRICAN AMERICANS')) %$%
  table(races, value,useNA = 'always')
#>                                 value
#> races                            both   DK ethnic mainstream <NA>
#>   1. ASIAN AMERICANS              324   53    825       1401 8545
#>   2. PACIFIC ISLANDERS             24   13     22        332 1249
#>   3. WHITES                         0    0      0          0 2004
#>   4. BLACKS OR AFRICAN AMERICANS   67   12     53        366 1582
#>   6. latinos                       47    1    142        302 1564
#>   9. MULTIRACIAL AMERICANS          0    0      0          0  220
#>   <NA>                              0    0      0          0    0
...