Функция R для объединения четырех переменных? - PullRequest
1 голос
/ 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»? Большое спасибо заранее.

Ответы [ 3 ]

1 голос
/ 15 января 2020
pre<-read.csv("https://www.dropbox.com/s/wzitbwr6q2i26gt/sampledata.csv?dl=1")

Это мое усилие, но код может быть немного длинным. Мои логики c: 1) заменить NA на пробел, 2) paste четыре переменные на переменную n_cat. Обратите внимание, что поскольку вы отредактировали вопрос, выходные значения выглядят не так, как в оригинальном сообщении и в @akrun.

pre[, 2:5] <- sapply(pre[, 2:5], function(x) stringr::str_replace_na(x, replacement = "")) 
pre$n_cat = paste0(pre$asian_news, pre$nhpi_news, pre$latino_news, pre$black_news)
table(pre$races, pre$n_cat)
#                                      both   DK ethnic mainstream
#  1. ASIAN AMERICANS              184  324   53    825       1401
#  2. PACIFIC ISLANDERS             19   24   13     22        332
#  3. WHITES                       501    0    0      0          0
#  4. BLACKS OR AFRICAN AMERICANS    8   36    5     24        163
#  5. BLACKS OR AFRICAN AMERICANS   14   31    7     29        203
#  6. latinos                       22   47    1    142        302
#  9. MULTIRACIAL AMERICANS         55    0    0      0          0

1 голос
/ 15 января 2020

Мы можем rep лицензировать столбец 'рас', в то время как unlist интересующие столбцы, а затем сделать table

table(rep(pre$races, 4), unlist(pre[3:6]), useNA = "always")
#                           both   DK ethnic mainstream 1. Pacific Islander or Asian American more <NA>
#  1. ASIAN AMERICANS             294   41    770        863                                          0 6472
#  2. PACIFIC ISLANDERS            24   13      0        332                                         22 1249
#  3. WHITES                        0    0      0          0                                          0 2000
#  4.BLACKS OR AFRICAN AMERICANS   67   12     53        366                                          0 1582
#  6. latinos                      47    1    142        302                                          0 1564
#  <NA>                             0    0      0          0                                          0    0
0 голосов
/ 15 января 2020

Используя dplyr и tidyr, мы можем получить данные в длинном формате, count количество наблюдений для races и значение из другого столбца и снова привести данные в широкоформатный формат.

library(dplyr)
library(tidyr)

pre %>%
  pivot_longer(cols = -races) %>%
  count(races, value) %>%
  pivot_wider(names_from = value, values_from = n)

#  races                           both    DK ethnic mainstream  `NA`
#  <fct>                          <int> <int>  <int>      <int> <int>
#1 1. ASIAN AMERICANS               324    53    825       1401  8545
#2 2. PACIFIC ISLANDERS              24    13     22        332  1249
#3 3. WHITES                         NA    NA     NA         NA  2004
#4 4. BLACKS OR AFRICAN AMERICANS    36     5     24        163   716
#5 5. BLACKS OR AFRICAN AMERICANS    31     7     29        203   866
#6 6. latinos                        47     1    142        302  1564
#7 9. MULTIRACIAL AMERICANS          NA    NA     NA         NA   220
...