我有一个任务要做如下的大量行,我想知道是否可以使用循环进行此类计算而无需逐行输入行。
我已经尝试但似乎在[]括号内,该函数似乎没有否定我想做的事情。任何建议表示赞赏!
data[, d1:= difference < 2]
data[, d2:= difference < 3]
data[, d3:= difference < 4]
data[, d4:= difference < 5]
data[, d5:= difference < 6]
data[, d6:= difference < 7]
data[, d7:= difference < 8]
data[, d8:= difference < 9]
data[, d9:= difference < 10]
data[, d10:= difference < 11]
data$d1 <- as.numeric(data$d1)
data$d2 <- as.numeric(data$d2)
data$d3 <- as.numeric(data$d3)
data$d4 <- as.numeric(data$d4)
data$d5 <- as.numeric(data$d5)
data$d6 <- as.numeric(data$d6)
data$d7 <- as.numeric(data$d7)
data$d8 <- as.numeric(data$d8)
data$d9 <- as.numeric(data$d9)
data$d10 <- as.numeric(data$d10)
答案 0 :(得分:4)
我们可以创建for
循环并指定(:=
)来创建新列
for(j in 1:10){
data[, paste0("d", j) := as.integer(difference < (j+1))]
}
或使用set
data[, paste0("d", 1:10) := 0L]
for(j in 1:10){
set(data, i = which(data[["difference"]] < (j + 1)), j = paste0("d", j),
value = 1L)
}
答案 1 :(得分:3)
只需添加已经工作和接受的答案的替代方法,就可以在单个lapply
调用中调用data.table
,以便一次创建多个列。在你的情况下:
j <- seq_len( 10 )
data[ , paste0("d", j) := lapply( j+1, function(x) ( difference < x ) * 1L ) ]
请注意,列名称(在:=
之前)表示为向量,列内容表示为列表的元素(lapply
的输出)。