我试着根据任意列列表计算欧几里得距离.我try 这样做来计算dt中的观测值和x中的单个观测值之间的距离.这看起来像预期的那样计算,但是我在第4行得到了一个警告,因为我没有通过引用赋值.

dt <- data.table(a=1:10, b=11:20, c=21:30)
x <- data.table(a=5, b=6, c=7)
for(i in names(dt)){
  dt[[i]] <- (dt[[i]] - x[1][[i]])^2
}
dt[, euclid := rowSums(.SD), .SDcols=names(dt)]
dt[, euclid := sqrt(euclid)]

所以我把第4行替换为setattr(dt, i, (dt[[i]] - x[1][[i]])^2)行,但实际上它并没有更新列.

我可能误解了setattr()的工作原理.我以为下面的两行是等价的,但显然不是.

dt[, foo := 2]
setattr(dt, "foo", 2)

我欢迎任何 idea 以及建议,以更好的方式做这件事.

我有数据.表v1.15.4

推荐答案

像这样?

cols <- c("a", "b", "c")
dt[, euclid := sqrt(rowSums(mapply(function(a, b) (a-b)^2,
                                   .SD, x[, .SD, .SDcols = cols]))),
    .SDcols = cols]
#         a     b     c   euclid
#     <int> <int> <int>    <num>
#  1:     1    11    21 15.39480
#  2:     2    12    22 16.43168
#  3:     3    13    23 17.57840
#  4:     4    14    24 18.81489
#  5:     5    15    25 20.12461
#  6:     6    16    26 21.49419
#  7:     7    17    27 22.91288
#  8:     8    18    28 24.37212
#  9:     9    19    29 25.86503
# 10:    10    20    30 27.38613

似乎有点Inceptiondt[, ...]里面使用x[, .SD]...

R相关问答推荐

在ComplexHeatmap中,如何更改anno_barplot()标题的Angular ?

按块将载体转换为矩阵-reshape

无法在我的情节中表现出显着的差异

警告:lmdif:info = 0. nls. lm()函数的输入参数不正确

derrr summarise每个组返回多行?

如何使用R对每组变量进行随机化?

如何在区分不同条件的同时可视化跨时间的连续变量?

删除具有相同标题的tabPanel(shinly)

标识R中多个列中缺少的唯一值

合并DFS列表并将索引提取为新列

绘制采样开始和采样结束之间的事件

根据r中另一个文本列中给定的范围对各列求和

R -基线图-图形周围的阴影区域

用多边形替换地块点

R预测包如何处理ARIMA(Auto.arima函数)中的缺失值

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

动态统计函数在ShinyApp内部更改

R:水平旋转图

R中的交叉表