Я бы предложил реструктурировать ваши данные из широкого в длинный формат, а затем использовать dplyr
.В этом случае каждая строка будет для наблюдения и будет иметь столбец для года, места №, лямбда, биомассы и т. Д., И она будет хранить все ваши данные в одном удобном фрейме данных.Получение данных для определенных сайтов, лет и т. Д. С помощью filter
легко.Вот пример:
# Create dummy data frame
df <- data.frame(year = 1981:2007,
t = 1:27,
S1 = sample(1:200, 27, replace = TRUE),
S2 = sample(1:200, 27, replace = TRUE),
S3 = sample(1:200, 27, replace = TRUE),
S4 = sample(1:200, 27, replace = TRUE),
S5 = sample(1:200, 27, replace = TRUE))
# Quick peak
head(df)
#> year t S1 S2 S3 S4 S5
#> 1 1981 1 163 133 86 59 40
#> 2 1982 2 99 28 190 179 58
#> 3 1983 3 94 136 6 47 185
#> 4 1984 4 199 87 137 31 20
#> 5 1985 5 157 169 172 24 21
#> 6 1986 6 105 33 189 122 148
Это структура ваших исходных данных в широком формате.Давайте изменим его на длинный формат и проведем некоторые вычисления.
# Load libraries
library(dplyr)
library(magrittr)
library(tidyr)
# 1) Convert to long format
# 2) Group by site for calculations
# 3) Calculate lambda, change in biomass
# 4) Ungroup
df %<>%
gather(site, biomass, S1:S5) %>%
group_by(site) %>%
mutate(lambda = biomass/lag(biomass),
delta_biomass = biomass - lag(biomass)) %>%
ungroup
# Quick peak
head(df)
# # A tibble: 6 x 6
# year t site biomass lambda delta_biomass
# <int> <int> <chr> <int> <dbl> <int>
# 1 1981 1 S1 175 NA NA
# 2 1982 2 S1 74 0.423 -101
# 3 1983 3 S1 177 2.39 103
# 4 1984 4 S1 15 0.0847 -162
# 5 1985 5 S1 28 1.87 13
# 6 1986 6 S1 150 5.36 122
Теперь ваши данные представлены в длинном формате, и мы провели некоторые вычисления, используя mutate
, который просто добавляет несколько столбцов в ваш фрейм данных.(Он также может перезаписывать столбцы.) Обратите внимание, что мне не нужно было создавать промежуточные столбцы с задержками в моих вычислениях, я просто использовал lag
.Таким образом, вы можете добавлять все свои вычисления без каких-либо циклов, и это обеспечивает чистый, читаемый код.Кроме того, реструктуризация данных, подобная этой, означает, что вам не нужно делать это для каждого столбца сайта, так как он применяется ко всем одновременно.
Сначала все эти данные могут показаться обременительнымивместе в одном месте, но на самом деле очень просто извлечь нужные данные, используя filter
.Например:
# Only see data for site S4 between 2000 and 2005
df %>%
filter(site == "S4",
between(year, 2000, 2005))
# # A tibble: 6 x 6
# year t site biomass lambda delta_biomass
# <int> <int> <chr> <int> <dbl> <int>
# 1 2000 20 S4 124 1.38 34
# 2 2001 21 S4 116 0.935 -8
# 3 2002 22 S4 178 1.53 62
# 4 2003 23 S4 92 0.517 -86
# 5 2004 24 S4 107 1.16 15
# 6 2005 25 S4 87 0.813 -20
Редактировать
Я пропустил группировку сайтов в исходной версии, которая теперь исправляется.