data.table 解决方案,假设您想要改变所有列*(请参阅下面的更灵活的版本)。
*正如 @sb0709 在 cmets 中提到的那样,mutate_all 也会这样做。
library( data.table )
df <- data.table( old_col_1 = 20:24,
old_col_2 = 55:49,
old_col_3 = rnorm( 5, 100, 30 ) )
df[ , sub( "old", "new", names( df ) ) := lapply( .SD, function(x) 15-x ) ]
这给出了:
R> df
old_col_1 old_col_2 old_col_3 new_col_1 new_col_2 new_col_3
1: 20 55 86.29104 -5 -40 -71.29104
2: 21 56 144.21564 -6 -41 -129.21564
3: 22 57 104.84574 -7 -42 -89.84574
4: 23 58 93.18084 -8 -43 -78.18084
5: 24 59 104.96188 -9 -44 -89.96188
如果您想选择少于所有列,您只需将names 向量和.SD 列表子集。例如,仅在第 2 列和第 3 列上运行您的突变:
df[ , sub( "old", "new", names( df )[2:3] ) := lapply( .SD[,2:3], function(x) 15-x ) ]
而是给出:
R> df
old_col_1 old_col_2 old_col_3 new_col_2 new_col_3
1: 20 55 138.28667 -40 -123.28667
2: 21 56 69.03836 -41 -54.03836
3: 22 57 147.39790 -42 -132.39790
4: 23 58 88.15505 -43 -73.15505
5: 24 59 28.96437 -44 -13.96437