R:将data.table列作为应用于另一data.table的函数的函数参数进行匹配

R:将data.table列作为应用于另一data.table的函数的函数参数进行匹配,r,data.table,R,Data.table,我正在尝试缩放一些数据以进行绘图。一些量表可能由用户提供,其他量表可以直接从数据中导出 因此,一组样本数据可能是: dt1 <- data.table(Time=1:10, a=10:1, b=11:20, c=rep(11:15,2)) setkey(dt1,"Time") dt.ranges <- data.table(a=c(1,10), b=c(11,20), c=c(11,20)) 结果是: a b c Time

我正在尝试缩放一些数据以进行绘图。一些量表可能由用户提供,其他量表可以直接从数据中导出

因此,一组样本数据可能是:

dt1 <- data.table(Time=1:10, a=10:1, b=11:20, c=rep(11:15,2))
setkey(dt1,"Time")
dt.ranges <- data.table(a=c(1,10), b=c(11,20), c=c(11,20))
结果是:

            a         b         c Time
 1: 1.0000000 0.0000000 0.0000000    1
 2: 0.8888889 0.1111111 0.1111111    2
 3: 0.7777778 0.2222222 0.2222222    3
 4: 0.6666667 0.3333333 0.3333333    4
 5: 0.5555556 0.4444444 0.4444444    5
 6: 0.4444444 0.5555556 0.0000000    6
 7: 0.3333333 0.6666667 0.1111111    7
 8: 0.2222222 0.7777778 0.2222222    8
 9: 0.1111111 0.8888889 0.3333333    9
10: 0.0000000 1.0000000 0.4444444   10
有人知道更好的方法吗

谢谢


Jason

我们从两个数据集中(
nm1
)获得列名的
相交(
nm1
)(假设列名的顺序相同)。将
.SDcols
指定为“nm1”,使用
Map
将函数应用于两个数据集的相应列,并将结果分配回(
:=

nm1 <- intersect(names(dt1), names(dt.ranges))
dt1[, (nm1) := Map(function(x,y)
         (x- min(y))/(max(y)-min(y)), 
              .SD, dt.ranges), .SDcols= nm1]
dt1
#    Time         a         b         c
# 1:    1 1.0000000 0.0000000 0.0000000
# 2:    2 0.8888889 0.1111111 0.1111111
# 3:    3 0.7777778 0.2222222 0.2222222
# 4:    4 0.6666667 0.3333333 0.3333333
# 5:    5 0.5555556 0.4444444 0.4444444
# 6:    6 0.4444444 0.5555556 0.0000000
# 7:    7 0.3333333 0.6666667 0.1111111
# 8:    8 0.2222222 0.7777778 0.2222222
# 9:    9 0.1111111 0.8888889 0.3333333
#10:   10 0.0000000 1.0000000 0.4444444

谢谢巧妙地使用Map()。我需要更多地了解R的函数编程方面。我需要在“不按相同顺序”的答案中使用
eval(nm1)
,并对答案进行了编辑以显示这一点。@Jason在没有
eval
的情况下,它对我有效。你能在一个新的R会话上尝试它吗?只是在一个新打开的会话上尝试了它,唯一加载的包是data.table,环境中没有任何内容。我仍然需要eval()来生成所需的结果。R版本3.2.3,平台:x86_64-w64-mingw32/x64(64位),data.table版本1.9。6@Jason用括号括起来,即
(nm1):=
适合我,我也是!让我们将括号包装称为规范的。:)非常感谢您的帮助和洞察力!
nm1 <- intersect(names(dt1), names(dt.ranges))
dt1[, (nm1) := Map(function(x,y)
         (x- min(y))/(max(y)-min(y)), 
              .SD, dt.ranges), .SDcols= nm1]
dt1
#    Time         a         b         c
# 1:    1 1.0000000 0.0000000 0.0000000
# 2:    2 0.8888889 0.1111111 0.1111111
# 3:    3 0.7777778 0.2222222 0.2222222
# 4:    4 0.6666667 0.3333333 0.3333333
# 5:    5 0.5555556 0.4444444 0.4444444
# 6:    6 0.4444444 0.5555556 0.0000000
# 7:    7 0.3333333 0.6666667 0.1111111
# 8:    8 0.2222222 0.7777778 0.2222222
# 9:    9 0.1111111 0.8888889 0.3333333
#10:   10 0.0000000 1.0000000 0.4444444
dt1[, eval(nm1) := Map(function(x,y)
       (x- min(y))/(max(y)-min(y)), 
        .SD, dt.ranges[, nm1, with=FALSE]), .SDcols= nm1]