R data.table,访问赋值函数内的矩阵

时间:2014-12-27 21:39:31

标签: r data.table vectorization

我有以下data.table

structure(list(xi = c(1, 1, 1, 2, 2, 2, 3, 3, 3), yi = c(1, 2, 
3, 1, 2, 3, 1, 2, 3), flag = c(0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("xi", 
"yi", "flag"), row.names = c(NA, -9L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x11a1a78>)

我还有一个3x3矩阵,如下所示。

structure(c(1, 1, 0.4, 1, 0, 0, 1, 0, 0.2), .Dim = c(3L, 3L))

我想为data.table flag分配第三列,这样如果由xi行和yi列表示的矩阵中的元素小于1,那么flag = 1其他0.我为此写了一个函数,

func <- function (x, y, m) {
if (m[x, y] < 1) {
    return(1)
}
else {
    return(0)
}
}

但是,如果我尝试

y[,flag := func(xi,yi,m)]

我的旗帜值总是0.有人能指出我在这里做错了吗? 提前谢谢。

1 个答案:

答案 0 :(得分:3)

您不需要自定义功能......

dt[ , flag := as.integer( m[cbind(xi,yi)] < 1 ) ]

您需要小心以正确的方式索引矩阵(使用cbind(...)而不是[,]索引形式。)