基于列名正则匹配选择含Value的列执行diff操作生成新列
批量处理含"Value"的列并生成指定格式新列
示例数据集
ff <- data.frame( id = c(1:4), w1...33112..Value = c(10, 20, 30, 40), w1...33112..Time = c(4, 3, 2, 1), w2...33113..Value = c(1, .9, .75, .7), w2...33113..Time = c(10, 50, 30, 20), w3...33552..Value = c(1, 2, 3, 4), w3...33552..Time = c(.5, .5, .9, .9), w4...33442..Value = c(100, 50, 40, 30), w4...33442..Time = c(2, 1, 4, 3), w5...35692..Value = c(.5, .6, .7, .8) )
需求
批量选择列名包含"Value"的列,对每列执行c(0, diff(.))操作(开头补0,后续为相邻行的差值),生成的新列名为原列名第一个点之前的字符串 + ".used"(比如w1...33112..Value对应新列w1.used)。
解决方案
使用dplyr的across函数可以高效实现批量处理,无需手动逐个列编写代码:
library(dplyr) ff.2 <- ff %>% mutate( # 筛选所有含"Value"的列 across(contains("Value"), # 执行差分操作,开头补0 ~ c(0, diff(.)), # 按规则生成新列名:提取原列名第一个点前的部分,拼接".used" .names = "{sub('\\..*', '', .col)}.used") )
代码说明
contains("Value"):自动匹配所有列名包含"Value"的目标列,无需手动列举~ c(0, diff(.)):对每列执行差分操作,开头补0保证新列行数与原数据一致sub('\\..*', '', .col):通过正则表达式提取原列名的前缀(第一个点之前的内容,如w1、w2),结合.names参数生成指定格式的新列名
输出结果
运行后ff.2会包含所有原列,以及新增的w1.used、w2.used等列:
> ff.2 id w1...33112..Value w1...33112..Time w2...33113..Value w2...33113..Time w3...33552..Value w3...33552..Time w4...33442..Value w4...33442..Time w5...35692..Value w1.used w2.used w3.used w4.used w5.used 1 1 10 4 1.0 10 1 0.5 100 2 0.5 0.0 0.00 0.0 0.00 0.0 2 2 20 3 0.9 50 2 0.5 50 1 0.6 10.0 -0.10 1.0 -50.00 0.1 3 3 30 2 0.75 30 3 0.9 40 4 0.7 10.0 -0.15 1.0 -10.00 0.1 4 4 40 1 0.70 20 4 0.9 30 3 0.8 10.0 -0.05 1.0 -10.00 0.1
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

