首页 > 解决方案 > R:计算一组变量和参考变量之间的绝对和相对差异

问题描述

我有一个名为 dat 的数据框,其结构如下:

dat
    ref test1 test2 test3 test4 test5 test6
1  1565  1432  1299  1166  1033   900   767
2  1232  1117  1002   887   772   657   542
3  1417  1342  1267  1192  1117  1042   967
4   895  1115  1335  1555  1775  1995  2215
5  2150  1890  1630  1370  1110   850   590
6  1565  1432  1299  1166  1033   900   767

我想创建一个脚本,它计算每个变量 test1、test2、test3(如果脚本可以选择名称以“test”开头的所有变量,那就太好了),testX 和 ref 之间的绝对和相对差异. 结果应该是如下的数据框:

结果

  test1_absdiff test2_absdiff test3absdiff test1_percdiff test2_percdiff test3percdiff
1          -133          -266         -399        -0.0850         -0.170        -0.255
2          -115          -230         -345        -0.0933         -0.187        -0.280
3           -75          -150         -225        -0.0529         -0.106        -0.159
4           220           440          660         0.246           0.492         0.737
5          -260          -520         -780        -0.121          -0.242        -0.363
6          -133          -266         -399        -0.0850         -0.170        -0.255

我可以编写代码来计算一个新变量,但我不知道如何将它应用于一组变量,定义为具有公共前缀(“test”)

感谢您的帮助!

标签: r

解决方案


dat=read.table(text="
    ref test1 test2 test3 test4 test5 test6
1  1565  1432  1299  1166  1033   900   767
2  1232  1117  1002   887   772   657   542
3  1417  1342  1267  1192  1117  1042   967
4   895  1115  1335  1555  1775  1995  2215
5  2150  1890  1630  1370  1110   850   590
6  1565  1432  1299  1166  1033   900   767",h=T)

k=which(grepl("test",colnames(dat)))

tmp1=dat[,k]-dat[,"ref"]
colnames(tmp1)=paste0(colnames(tmp1),"_absdiff")
tmp2=(dat[,k]-dat[,"ref"])/dat[,"ref"]
colnames(tmp2)=paste0(colnames(tmp2),"_percdiff")

round(cbind(tmp1,tmp2),3)

  test1_absdiff test2_absdiff test3_absdiff test4_absdiff test5_absdiff test6_absdiff test1_percdiff
1          -133          -266          -399          -532          -665          -798         -0.085
2          -115          -230          -345          -460          -575          -690         -0.093
3           -75          -150          -225          -300          -375          -450         -0.053
4           220           440           660           880          1100          1320          0.246
5          -260          -520          -780         -1040         -1300         -1560         -0.121
6          -133          -266          -399          -532          -665          -798         -0.085
  test2_percdiff test3_percdiff test4_percdiff test5_percdiff test6_percdiff
1         -0.170         -0.255         -0.340         -0.425         -0.510
2         -0.187         -0.280         -0.373         -0.467         -0.560
3         -0.106         -0.159         -0.212         -0.265         -0.318
4          0.492          0.737          0.983          1.229          1.475
5         -0.242         -0.363         -0.484         -0.605         -0.726
6         -0.170         -0.255         -0.340         -0.425         -0.510

推荐阅读