如何在R语言中高效计算列与前一列的数值差值?
批量计算每行相邻列的数值差值
需求说明
我需要计算数据框每行中后一列与前一列的数值差值,示例如下:
原始数据:
1 2 3 R1. 50 60 90 R2. 80 95 115 R3. 90 100 120
计算规则:第2列-第1列、第3列-第2列、第n列-第n-1列,最终生成的结果表如下:
1 2 R1. 10 30 R2. 15 20 R3. 10 20
现有手动实现方式
目前我针对少量列手动写了如下代码,但面对大量列/行时效率太低:
# 计算差值 diff_new = tab_new[,2] - tab_new[,1] diff_new2 = tab_new[,3] - tab_new[,2] diff_new3 = tab_new[,4] - tab_new[,3] diff_new4 = tab_new[,5] - tab_new[,4] # 合并成新表 diff.table_new = cbind(diff_new,diff_new2,diff_new3,diff_new4)
高效解决方案
在R中可以用**apply()函数结合diff()**批量处理,一行代码就能完成所有行的相邻列差值计算:
# 按行计算相邻列差值,转置后转为数据框 diff.table_new = as.data.frame(t(apply(tab_new, 1, diff)))
如果习惯tidyverse风格,也可以用dplyr包实现:
library(dplyr) library(tidyr) diff.table_new = tab_new %>% rowwise() %>% mutate(diff_vals = list(diff(c_across(everything())))) %>% unnest_wider(diff_vals)
代码说明
apply(tab_new, 1, diff):对数据框tab_new的每一行(参数1代表按行处理)应用diff()函数,该函数默认计算向量中后一个元素减前一个元素的差值。t():apply返回的结果是按列排列的,转置后才能匹配原数据的行结构。as.data.frame():将运算得到的矩阵转为数据框,方便后续分析处理。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

