как рассчитать стойкость в днях для персонажей - PullRequest
0 голосов
/ 02 октября 2018

Допустим, у нас есть эти данные:

type <- paste("type", c(1,1,1,2,3,1,2,2,3,3,3,3,1,1))
dates <- seq(as.Date("2000/1/1"), by = "days", length.out = length(type)) 
mydataframe <- data.frame(type, dates)

В других публикациях я видел, что rle может выполнять эту работу, но я хочу получить информационный кадр, где для каждого типа,У меня средняя стойкость в днях.Что-то вроде:

> print(persistance)
  type1 type2 type3
1     2   1.5   2.5

Кто-нибудь знает, как это сделать, пожалуйста?Спасибо!

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Альтернативное (групповое) решение:

type <- paste("type", c(1,1,1,2,3,1,2,2,3,3,3,3,1,1))
dates <- seq(as.Date("2000/1/1"), by = "days", length.out = length(type)) 
mydataframe <- data.frame(type, dates)

library(dplyr)

mydataframe %>%
  count(type, group = cumsum(type != lag(type, default = first(type)))) %>%
  group_by(type) %>%
  summarise(Avg = mean(n))

# # A tibble: 3 x 2
#     type     Avg
#    <fct>  <dbl>
# 1 type 1   2  
# 2 type 2   1.5
# 3 type 3   2.5
0 голосов
/ 02 октября 2018

Для этого можно использовать базовые функции R rle и aggregate.

# set up the data as in your question
type <- paste("type", c(1,1,1,2,3,1,2,2,3,3,3,3,1,1))
dates <- seq(as.Date("2000/1/1"), by = "days", length.out = length(type)) 
mydataframe <- data.frame(type, dates)

# calculate the length of the run using rle 
runs <- rle(as.character(mydataframe$type))
# calculate the average length of the run
aggregate(runs[[1]], by = runs[2], FUN = mean)

Обратите внимание, что это предполагает, что даты в столбце даты действительно последовательны.Если у вас был пробел в датах и ​​вы хотели бы рассматривать его как отдельные прогоны, вам пришлось бы немного изменить формулы, чтобы по-настоящему работать с датами в столбце dates.

0 голосов
/ 02 октября 2018

data.table

library(data.table)
runs <- setDT(rle(as.character(mydataframe$type)))
runs[, mean(lengths), values]

#    values  V1
# 1: type 1 2.0
# 2: type 2 1.5
# 3: type 3 2.5

tidyverse & magrittr

library(tidyverse)
library(magrittr)

rle(as.character(mydataframe$type)) %$% 
  tibble(lengths, values) %>% 
  group_by(values) %>% 
  summarise_all(mean)

# # A tibble: 3 x 2
#   values lengths
#   <chr>    <dbl>
# 1 type 1    2.00
# 2 type 2    1.50
# 3 type 3    2.50

dplyr

library(dplyr)
rle(as.character(mydataframe$type)) %>% 
  unclass %>%
  as.data.frame %>% 
  group_by(values) %>% 
  summarise_all(mean)
...