Преобразование данных: распространение категориального фрейма данных на количество R

#r #dplyr

Вопрос:

Я пытаюсь преобразовать фрейм данных с несколькими категориальными переменными в значения частоты.

Данные выглядят так:

 Site  Date          ID  X1      X2      X3
A     June - 01/16  1   aware   resting resting
B     June - 03/16  2   aware   feeding feeding
C     June - 01/16  1   resting aware   aware
 

И я хочу превратить его во что-то вроде этого:

 site   date           ID  aware   resting   feeding
A      June - 01/16   1   3       2         1 
B      June - 01/16   2   1       0         2 
 

Я пытался использовать dplyr, но мне не удалось выбрать все переменные, которые я хочу (X1, X2 и X3)

 data_frame %>% 
  dplyr::count((data_frame[c(1:3)]),cbind(data_frame[c(4:6)])) %>% 
  tidyr::spread(key = (data_frame[c(4:6)]),value = n)
 

Это пример моих данных:

 data_frame <- structure(data.frame(site = c("A", "B", "C", "A", "B", "C", "D"), 
date = c("June - 01/16","June - 03/16", "June - 01/16", "June - 01/16", "June - 03/16", "June - 03/16", "June - 03/16"), 
ID = c("1", "2", "1", "3", "1", "2", "3"), 
X1= c("aware", "aware","resting","feeding","aware", "resting","feeding"),
X2 = c("resting","feeding","aware","na","na","aware","resting"),
X3 = c("resting","feeding","aware", "aware","resting","feeding","aware")))
 

Ответ №1:

Мы могли бы изменить формат в «длинный», получить его на count основе столбца и изменить обратно в «широкий» с помощью pivot_wider

 library(dplyr)
library(tidyr)
data_frame %>% 
   pivot_longer(cols = X1:X3) %>% 
   select(-name) %>%
   count(site, date, ID, value) %>% 
   pivot_wider(names_from = value, values_from = n, values_fill = 0)
 

Или мы можем использовать values_fn

 data_frame %>% 
   pivot_longer(cols = X1:X3) %>% 
   select(-name) %>%       
   pivot_wider(names_from = value, values_from = n, values_fill = 0,
        values_fn = length)
 

Комментарии:

1. Спасибо тебе, акрун. Не могли бы вы, пожалуйста, проверить мой код и сказать, почему я получаю NA ?

Ответ №2:

Обновление: С помощью akrun вот код с add_count

 data_frame %>%    
  pivot_longer(cols = c(X1, X2, X3)) %>%    
  add_count(value) %>% select(-name) %>% 
  distinct %>%  
  pivot_wider(names_from = "value", values_from = n, values_fill = 0)  
 

Выход:

   site  date         ID    aware resting feeding    na
  <chr> <chr>        <chr> <int>   <int>   <int> <int>
1 A     June - 01/16 1         8       6       0     0
2 B     June - 03/16 2         8       0       5     0
3 C     June - 01/16 1         8       6       0     0
4 A     June - 01/16 3         8       0       5     2
5 B     June - 03/16 1         8       6       0     2
6 C     June - 03/16 2         8       6       5     0
7 D     June - 03/16 3         8       6       5     0
 

Комментарии:

1. может быть, вы пропустили values_fill = 0

2. Я считаю add_count , что это создает столбец подсчетов. Возможно, вам понадобится обобщенная колонка, т. е. data_frame %>% pivot_longer( cols = c(X1, X2, X3) ) %>% add_count(value) %>% select(-name) %>% distinct %>% pivot_wider(names_from = "value", values_from = n, values_fill = 0 )

3. @akrun. Ты действительно здесь лучший! Большое вам спасибо!