DT中的列乘以DT [i,j]

时间:2019-06-20 03:25:56

标签: r data.table

问题1:第1行引发错误。为什么以及如何将所有列乘以DT [i,j]? 问题2:第2行有效,但是有更好的方法将所有其他列乘以一列吗?

df=data.table(matrix(1:15,3,5))
df[ , lapply(.SD, function(x) {x*df$V5), .SDcols = c("V1","V2","V3","V4")] #line 1
df[ , lapply(.SD, function(x) {x*df[1,"V5"})}, .SDcols = c("V1","V2","V3","V4")] #line 2

1 个答案:

答案 0 :(得分:4)

当我们将一列与其余列相乘时,要么直接对Data.table的子集进行相乘

func deleteWord(_ word: RelatedWord) {
        do {
            try self.write {
                self.delete(word)
            } 
        } catch let error {
             print(error.localizedDescription)
        }
    self.refresh()
}

或与df[, .SD * V5, .SDcols = V1:V4]

lapply

请注意,在两种情况下,我们都不会更新原始数据集列。为此,我们需要df[, lapply(.SD, `*`, V5), .SDcols = V1:V4]

:=

在OP的代码中,df[, paste0("V", 1:4) := .SD * V5, .SDcols = V1:V4] 中缺少结束符}

line 1

应该是

df[ , lapply(.SD, function(x) {x*df$V5), .SDcols = c("V1","V2","V3","V4")] 
                                      ^^

在这里,我们并不需要数据表中的那些curly。可以将列名引用为无引号,而不用df[, lapply(.SD, function(x) { x* V5 }), .SDcols = V1:V4] 来引用,而df$的缩写形式是列名表示为范围(.SDcols