如何在R中为数据表创建循环?

时间:2017-01-05 07:28:51

标签: r loops data.table

我有一个任务要做如下的大量行,我想知道是否可以使用循环进行此类计算而无需逐行输入行。

我已经尝试但似乎在[]括号内,该函数似乎没有否定我想做的事情。任何建议表示赞赏!

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)

2 个答案:

答案 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的输出)。