Как написать функцию, которая собирает определенный c список наблюдений из фрейма данных временного ряда - PullRequest
0 голосов
/ 20 января 2020

В приведенном ниже наборе данных предположим, что я случайно выбрал 20 плоских камней. Каждой из этих скал был присвоен уникальный идентификационный номер. Я измерил концентрацию 7 веществ (медь, железо, углерод, свинец, Mg, CaCO и Zin c) по поверхности самой длинной оси каждой породы. Расстояние записывается в мм, и, следовательно, является функцией длины каждой породы. Обратите внимание, что не все скалы имеют одинаковую длину. Местоположение - это группирующая переменная, которая описывает, где была взята Скала.

ID <- data.frame(ID=rep(c(12,122,242,329,595,130,145,245,654,878), each = 200))
ID2 <- data.frame(ID=rep(c(863,425,24,92,75,3,200,300,40,500), each = 300))
RockID<-data.frame(RockID = c(unlist(ID), unlist(ID2)))
Location <- rep(c("Alpha","Beta","Charlie","Delta","Echo"), each = 1000)
a <- rep(c(1:200),times = 10)
b <- rep(c(1:300), times = 10)
Time <- data.frame(Time = c(unlist(a), unlist(b)))
set.seed(1)
Copper <- rnorm(5000, mean = 0, sd = 5)
Iron <- rnorm(5000, mean = 0, sd = 10)
Carbon <- rnorm(5000, mean = 0, sd = 1)
Lead <- rnorm(5000, mean = 0, sd = 4)
Mg <- rnorm(5000, mean = 0, sd = 6)
CaCO <- rnorm(5000, mean = 0, sd = 2)
Zinc <- rnorm(5000, mean = 0, sd = 3)
data <-cbind(RockID, Location, Time,Copper,Iron,Carbon,Lead,Mg,CaCO,Zinc)
data$ID <- as.factor(data$RockID)

Я хочу создать новый фрейм данных, который содержит следующую информацию: 1. Первое наблюдение и последнее наблюдение для каждого человека 2. Среднее из первых 3 наблюдений и последних 3 наблюдений для каждого индивидуальный 3. То же, что и шаг 2. для первого и последнего 5, 7 и 10 наблюдений, я хочу, чтобы новый фрейм данных был настроен следующим образом:

ID  FirstPt First3  First5  First7  First10 LastPt  Last3  Last5  Last7  Last10 
12   …       …        …      …         …     …       …      …      …     … 
122 
242
329
595
130
145
245
654
878
863
425
ect...

Как мне написать функцию для сообщник sh это?

1 Ответ

0 голосов
/ 21 января 2020

Мы можем создать функцию для вычисления среднего первого и последнего n значений. Используйте pivot_longer, чтобы получить данные в длинном формате, group_by каждый RockID и вещество и вычислите среднее значение.

library(dplyr) 

average_of_first_n_values <- function(value, x) mean(head(value, x))
average_of_last_n_values <-  function(value, x) mean(tail(value, x))

data %>%
  tidyr::pivot_longer(cols = Copper:Zinc) %>%
  group_by(RockID, name) %>%
  summarise(first_obs = first(value), 
            last_obs = last(value), 
            first_3_avg = average_of_first_n_values(value, 3), 
            first_5_avg = average_of_first_n_values(value, 5), 
            first_7_avg = average_of_first_n_values(value, 7), 
            first_10_avg = average_of_first_n_values(value, 10), 
            last_3_avg = average_of_last_n_values(value, 3), 
            last_5_avg = average_of_last_n_values(value, 5), 
            last_7_avg = average_of_last_n_values(value, 7), 
            last_10_avg = average_of_last_n_values(value, 10))
...