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]