Как считать экземпляры в таблице в R - PullRequest
0 голосов
/ 01 апреля 2020

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

Моя таблица выглядит следующим образом:

Infected  Education age    sex    race     Score
       0      missing   35   Female   missing   1371.07
       1      Higher    39   Female   Black     1466.49
       0      Higher    27   Female   Asian     8020.09
       1      A-level   36   Female   Black     398.67
       1      GCSE      32   Male     Other     1312.80

Это код, используемый для его создания:

 df<-  structure(list(Infected = structure(c(1L, 2L, 1L, 2L, 2L), .Label = c("0", 
    "1"), class = "factor"), Education = structure(c(1L, 4L, 4L, 
    2L, 3L), .Label = c("missing", "A-level", "GCSE", "Higher"), class = "factor"), 
        age = c(35L, 39L, 27L, 36L, 32L), sex = structure(c(3L, 3L, 
        3L, 3L, 2L), .Label = c("Missing_Other", "Male", "Female"
        ), class = "factor"), race = structure(c(1L, 3L, 2L, 3L, 
        4L), .Label = c("missing", "Asian", "Black", "Other", "White"
        ), class = "factor"), Score = c(1371.06994628906, 1466.48999023438, 
        8020.08984375, 398.670013427734, 1312.80004882812)), class = "data.frame", row.names = c(221L, 
    261L, 444L, 561L, 702L))

Я уже пытался использовать пакет dplyr для подсчета и группировки экземпляров, но я новичок в R, поэтому боюсь, что мой код не дает желаемого результата .

Это код, который я уже пробовал, но я не уверен, как я могу изменить это, чтобы получить желаемый результат:

table <-df %>% group_by(Infection) %>% count(sex,Education,age,race,Score)

Мой желаемый результат будет выглядеть так:

                 Infection_1     Infection_0    Infection_All
**ALLSex**                 
Male                 1(0%)         0(0%)            1(20%)
Female               2(40%)         2(40%)           4(80%
**Education**
Missing              0(0%)          1(20%)           1(20%)
Higher               1(20%)         1(20%)           2(40%)
Alevel               1(20%)         0(0%)            2(20%)
GCSE                 1(20%)         0(0%)            1(20%)
**Race**
Black                2(40%)         0(0%)            2(40%)
Asian                1(20%)         0(0%)            1(20%)
Other                0(0%)          1(20%)           1(20%)
White                0(0%)          0(0%)            0(0%)
Other                1(20%)         0(0%)            1(20%)

1 Ответ

0 голосов
/ 01 апреля 2020

Вам нужно несколько dplyr шагов, чтобы достичь желаемой таблицы. Вот как вы можете получить счет в tibble.

df %>% 
  select(-Score, -age) %>%
  gather(key="Category", value="Level", -Infected) %>%
  mutate(Infected = paste("Infected", Infected, sep="_")) %>%
  group_by(Category, Level, Infected) %>%
  count() %>%
  spread(Infected, n, fill = 0) %>%
  mutate(Infected_all = Infected_0 + Infected_1)
# A tibble: 10 x 5
# Groups:   Category, Level [10]
   Category  Level   Infected_0 Infected_1 Infected_all
   <chr>     <chr>        <dbl>      <dbl>        <dbl>
 1 Education A-level          0          1            1
 2 Education GCSE             0          1            1
 3 Education Higher           1          1            2
 4 Education missing          1          0            1
 5 race      Asian            1          0            1
 6 race      Black            0          2            2
 7 race      missing          1          0            1
 8 race      Other            0          1            1
 9 sex       Female           2          2            4
10 sex       Male             0          1            1
Warning message:
attributes are not identical across measure variables;
they will be dropped  

Вот шаги, описанные.

Удалите ненужные столбцы с помощью select, затем поверните столбцы с помощью gather и задайте имена полученных столбцов.

> df %>% 
+   select(-Score, -age) %>%
+   gather(key="Category", value="Level", -Infected)
   Infected  Category   Level
1         0 Education missing
2         1 Education  Higher
3         0 Education  Higher
4         1 Education A-level
5         1 Education    GCSE
6         0       sex  Female
7         1       sex  Female
8         0       sex  Female
9         1       sex  Female
10        1       sex    Male
11        0      race missing
12        1      race   Black
13        0      race   Asian
14        1      race   Black
15        1      race   Other

Замените значение зараженного столбца его именем и значением используя mutate. Они будут использоваться в качестве имен столбцов позже. Выполните подсчет, как вы уже знаете.

> df %>% 
+   select(-Score, -age) %>%
+   gather(key="Category", value="Level", -Infected) %>%
+   mutate(Infected = paste("Infected", Infected, sep="_")) %>%
+   group_by(Category, Level, Infected) %>%
+   count()
# A tibble: 12 x 4
# Groups:   Category, Level, Infected [12]
   Category  Level   Infected       n
   <chr>     <chr>   <chr>      <int>
 1 Education A-level Infected_1     1
 2 Education GCSE    Infected_1     1
 3 Education Higher  Infected_0     1
 4 Education Higher  Infected_1     1
 5 Education missing Infected_0     1
 6 race      Asian   Infected_0     1
 7 race      Black   Infected_1     2
 8 race      missing Infected_0     1
 9 race      Other   Infected_1     1
10 sex       Female  Infected_0     2
11 sex       Female  Infected_1     2
12 sex       Male    Infected_1     1

Поверните строки обратно в столбцы, используя функцию spread. Добавьте столбец Зараженные все, используя mutate.

Затем вы можете использовать другие пакеты, такие как xtable для форматирования вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...