Изменение формы по идентификатору и прогнозу интенсивности деятельности (суммы) - PullRequest
0 голосов
/ 12 мая 2018

У меня есть датафрейм, который организован по метке времени и идентификатору.Для каждого ID # и каждой минуты у меня есть 8 столбцов данных, каждый с четырьмя различными типами прогнозов интенсивности активности.Прогноз может быть сидячий, легкий, умеренный или энергичный.Данные представлены в следующем формате:

id  time    x1          x2     x3
1   10:30   Moderate    Light  Light
1   10:31   Moderate    Light  Moderate
...
2   12:24   Light       Light  Light
2   12:25   Light       Light  Light

Я надеюсь получить суммы каждой интенсивности активности для каждой переменной прогнозирования (x1, x2, x3, ... и т. Д.) Для каждого идентификатора.Используя приведенный выше пример, я надеюсь изменить свои данные, чтобы они выглядели так:

id  Intensity   x1     x2     x3
1   Light       0      2      1
1   Moderate    2      0      1
...
2   Light       2       2     2
2   Moderate    0       0     0

Мой файл имеет около 80 идентификаторов и 8 столбцов прогнозирования интенсивности активности (x1-x8), на случай, если это имеет значение.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Надеюсь, это поможет!

library(tidyverse)

df %>%
  select(-time) %>%
  gather(key, intensity, -id) %>%
  group_by(id, intensity, key) %>%
  tally() %>%
  spread(key, n) %>%
  replace(is.na(.), 0)

Вывод:

     id intensity    x1    x2    x3
1     1 Light         0     2     1
2     1 Moderate      3     0     2
3     1 Sedentary     1     0     1
4     1 Vigorous      0     2     0
5     2 Light         2     0     2
6     2 Moderate      1     1     0
7     2 Sedentary     0     2     0
8     2 Vigorous      0     0     1

Пример данных:

df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), time = c("10:30", 
"10:31", "10:32", "10:33", "12:24", "12:25", "12:26"), x1 = c("Moderate", 
"Moderate", "Sedentary", "Moderate", "Light", "Moderate", "Light"
), x2 = c("Light", "Light", "Vigorous", "Vigorous", "Moderate", 
"Sedentary", "Sedentary"), x3 = c("Light", "Moderate", "Moderate", 
"Sedentary", "Light", "Light", "Vigorous")), class = "data.frame", row.names = c(NA, 
-7L))
#  id  time        x1        x2        x3
#1  1 10:30  Moderate     Light     Light
#2  1 10:31  Moderate     Light  Moderate
#3  1 10:32 Sedentary  Vigorous  Moderate
#4  1 10:33  Moderate  Vigorous Sedentary
#5  2 12:24     Light  Moderate     Light
#6  2 12:25  Moderate Sedentary     Light
#7  2 12:26     Light Sedentary  Vigorous
0 голосов
/ 12 мая 2018

Предполагая, что переменная time не используется, вы можете сделать что-то вроде этого:

library(tidyverse)
library(data.table)

df %>%
  select(-time) %>% 
  data.table::melt("id") %>% 
  data.table::dcast(id+value~variable) %>% 
  rename(Intensity = value)
0 голосов
/ 12 мая 2018

Вот решение с использованием пакета tidyverse пакетов:

library(tidyverse)

values <- c("Sedentary", 'Light', 'Moderate', 'Vigorous')
df %>%
  mutate_at(vars(starts_with("x")), ~ factor(., levels = values)) %>%
  gather(key, value, - id, - time, factor_key = TRUE) %>%
  group_by(id, key, value) %>%
  summarize(
    n = n()
  ) %>%
  spread(key, n, fill = 0L, drop = FALSE)
...