ОБНОВЛЕНИЕ
Первоначально я неправильно понял запрос. Вот ответ, который должен дать вам то, что вы ищете.
@ Ответ qdread хорош и лаконичен. Это длиннее, но придерживается синтаксиса tidyverse.
library(dplyr)
library(tidyr)
data <- data %>% mutate(grp.start = if_else(!is.na(number.stds), 1, 0),
smpl.grp = cumsum(grp.start),
smpl.grp = if_else(!is.na(number.stds) & row_number() != 1, lag(smpl.grp), smpl.grp)) %>%
select(smpl.grp, everything(), -grp.start)
data.2 <- data %>%
filter(!is.na(number.stds)) %>%
select(smpl.grp, std.value.1:std.value.3) %>%
mutate(smpl.grp = if_else(row_number() == 1, 0, smpl.grp)) %>% #assigns first row a grp # of 0 but keeps its standard values in our dataset, takes care of edge issues going forward.
pivot_longer(std.value.1:std.value.3, names_to = "standard.rep", names_prefix = "std.value.", values_to = "std.values") %>%
select(standard.rep, everything()) %>%
group_by(standard.rep) %>%
arrange(standard.rep, smpl.grp) %>%
mutate(std.values.2 = lag(std.values)) %>%
pivot_longer(std.values:std.values.2, names_to = "std.grps", values_to = "std.values") %>%
group_by(smpl.grp) %>%
summarise(std.n = sum(!is.na(std.values)), std.avg = mean(std.values, na.rm = T)) %>%
left_join(select(data, smpl.grp, co2), .)
data.2
# A tibble: 36 x 4
smpl.grp co2 std.n std.avg
<dbl> <dbl> <int> <dbl>
1 1 464 5 592.
2 1 345 5 592.
3 1 389 5 592.
4 1 831 5 592.
5 1 374 5 592.
6 1 323 5 592.
7 1 486 5 592.
8 1 542 5 592.
9 1 429 5 592.
10 1 624 5 592.
# … with 26 more rows
Сначала я назначил уникальный идентификатор каждой группе семплов ("smpl.grp"), которую вы хотите сравнить с различными наборами. стандартных средних значений
Затем мы можем удалить посторонние строки и работать только с соответствующими данными: номерами групп выборок и стандартными значениями.
Следующий шаг несколько приводит в порядок данные с pivot_longer()
, так что все стандартные значения находятся в одном столбце.
Затем данные группируются по стандартному представлению и упорядочиваются по стандартному представителю и группе образцов. Я БЫ. Это настраивает создание дополнительного столбца со вторым набором стандартных значений, которые вы хотите связать с этой группой, используя mutate()
и lag()
.
Поворачивая снова, вы снова гарантируете, что все ваши стандартные значения находятся в одном столбце, и теперь все связаны с их желаемыми идентификаторами группы выборок.
Затем все, что осталось сделать, это summarise()
по группе выборок и объединить с исходным набором данных smpl.grp.
DATA (с истинным NA
s)
tibble(co2=c(464,345,389,831,374,323,486,542,429,624,359,612,738,720,520,454,499,616,952,805,582, 646,566,781,745,615,639,750,780,1119,584,1345,1020,1038,1419,1136),
number.stds=c(3,rep(NA_real_,13),2,rep(NA_real_,20),3),
std.value.1=c(618,rep(NA_real_,13),534,rep(NA_real_,20),546),
std.value.2=c(621,rep(NA_real_,13),564,rep(NA_real_,20),549),
std.value.3=c(625,rep(NA_real_,34),553)) -> data