可以使用dplyr中的group_by和mutate函数来实现该需求。

假设数据框名为df,列名为value。

首先,将数据框按照每4行分组:

df_grouped <- df %>%
  group_by(group = rep(1:(nrow(df) %/% 4 + 1), each = 4, length.out = nrow(df)))

其中,rep函数生成每个元素所在的组号,将其按照每4个元素循环生成,并赋值给新列group。每组的长度可能不足4,需要在末尾补齐,这里使用了length.out参数。

接下来,计算每组的斜率:

df_slope <- df_grouped %>%
  mutate(Slope = ifelse(sum(!is.na(value)) == 4, (value[4] - value[1])/30, NA)) %>%
  ungroup()

其中,使用了ifelse函数判断该组是否有4个非缺失值,如果是,则计算斜率,否则为NA。最后使用ungroup函数去除分组信息。

接下来,需要处理首末位置的缺失值情况。首先,找到首末位置的缺失值所在的行:

missing_rows <- which(is.na(df$value))

然后,将缺失值所在的行分别加上1和减去1,用于计算斜率:

missing_rows_adj <- unique(c(missing_rows - 1, missing_rows + 1))

接着,将缺失值所在的行和其相邻行组成新的分组:

missing_groups <- unique((missing_rows_adj - 1) %/% 4 + 1)

最后,对于每个缺失值所在的行,重新计算其所在组的斜率,并将结果追加到每组的第一行后面:

for (i in missing_rows) {
  group_num <- (i - 1) %/% 4 + 1
  if (group_num %in% missing_groups) {
    slope <- df_slope %>%
      filter(group == group_num) %>%
      summarize(Slope = (value[4] - value[1])/30) %>%
      pull(Slope)
    df_slope$value[i] <- slope * 30 + df_slope$value[i - 1]
  }
}

其中,使用了filter和summarize函数计算缺失值所在组的斜率,然后使用pull函数提取Slope列的值,并将其乘以30加到缺失值前面的值上。

最后,去掉新增的group列,得到最终结果:

df_final <- df_slope %>%
  select(-group)

原文地址: https://www.cveoy.top/t/topic/Mn4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录