#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. Ты действительно здесь лучший! Большое вам спасибо!