在R中为长格式数据框计算连续测量的平均真实变异性
解决方案
首先需要注意你的数据中A和B列是字符类型,第一步要先转换为数值类型才能进行计算。下面提供两种实现方式:
方式1:使用dplyr包(推荐,代码更直观)
# 加载dplyr包 library(dplyr) # 转换数据类型 DF$A <- as.numeric(DF$A) DF$B <- as.numeric(DF$B) # 分组计算新列C DF <- DF %>% group_by(ID) %>% mutate( # 计算截至当前行的B列非NA值累积和 cumulative_sum = cumsum(ifelse(is.na(B), 0, B)), # 标记组内行号 row_num = row_number(), # 计算C:累积和除以(当前测量次数-1),第一行设为NA C = ifelse(row_num == 1, NA, cumulative_sum / (row_num - 1)) ) %>% ungroup() %>% # 移除中间辅助列 select(-cumulative_sum, -row_num)
方式2:使用Base R(无需额外安装包)
# 转换数据类型 DF$A <- as.numeric(DF$A) DF$B <- as.numeric(DF$B) # 按ID分组计算新列C DF$C <- ave(DF$B, DF$ID, FUN = function(x) { # 计算累积和,NA值按0处理 cs <- cumsum(ifelse(is.na(x), 0, x)) # 获取组内行号序列 n <- seq_along(x) # 计算C值,第一行设为NA ifelse(n == 1, NA, cs / (n - 1)) })
计算逻辑说明
- 按
ID分组处理,确保每个ID的计算独立进行 - 对
B列的NA值,在累积和计算时按0处理,不影响求和结果 - 分母使用组内行号-1,对应“测量次数减1”的要求,第一行因无前置测量,C值设为NA
内容的提问来源于stack exchange,提问作者19056530
相关产品推荐
相关产品推荐

