R数据框有一列数据要求利用dplyr按照顺序每四行数值为一组计算一个斜率Slope第四行数值减去第一行数值的差值与30的比值并追加到数据框如果达到指定位置为缺失值第一行或者最后一行则变成三行数据计算斜率但这一次计算之后恢复四行计算 返回的结果追加到每次计算的第一行后面即第一行为空值也追加在空值后面
假设数据框为df,按照以上要求进行计算和追加斜率列的代码如下:
library(dplyr)
# 定义计算斜率的函数
calc_slope <- function(x) {
if (length(x) == 4) {
slope <- (x[4] - x[1]) / 30
} else {
slope <- (x[3] - x[1]) / 20
}
return(slope)
}
# 按照顺序每四行或三行计算斜率并追加到数据框
df <- df %>%
group_by(group = cumsum(row_number() %% 4 == 1)) %>% # 每四行分为一组
mutate(slope = ifelse(n() == 4, calc_slope(value), NA), # 如果是四行数据则计算斜率,否则为NA
slope = ifelse(row_number() == 1 & n() == 3, calc_slope(c(value[1], NA, value[2:3])), slope), # 如果是三行数据且第一行则计算斜率,并将结果追加到第一行后面
slope = ifelse(row_number() == 3 & n() == 3, calc_slope(c(NA, value[1:2], NA)), slope)) # 如果是三行数据且第三行则计算斜率,并将结果追加到第一行后面
# 删除辅助列
df <- df %>% select(-group)
其中,cumsum(row_number() %% 4 == 1)表示将每四行分为一组,并且每一组的第一行标记为1,第二行标记为2,以此类推。ifelse()函数用来判断是否是四行数据或者是三行数据的第一行或者第三行,并进行相应的计算和结果追加。最后,删除辅助列group。
原文地址: http://www.cveoy.top/t/topic/Mjy 著作权归作者所有。请勿转载和采集!