【问题标题】:how to make loop for data table in R?如何在R中为数据表制作循环?
【发布时间】:2017-01-05 07:28:50
【问题描述】:

我有一项任务要针对大量行执行以下操作,我想知道是否可以在不逐行键入行的情况下使用循环进行此类计算。

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

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)

【问题讨论】:

  • 是的,您可以使用lapply。提供一个可重现的示例,我们可以向您展示。为什么as.numeric 使用(慢)data.frame 分配?
  • 因为我想计算差异但不知道如何用数据表计算logi类型,所以我想我会这样做

标签: r loops data.table


【解决方案1】:

我们可以创建一个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)
}

【讨论】:

  • 通常最好使用 setfor 循环。
【解决方案2】:

只是为已经工作和接受的答案添加替代方案,可以在单个 data.table 调用中调用 lapply,以便一次创建多个列。在你的情况下:

j <- seq_len( 10 )
data[ , paste0("d", j) := lapply( j+1, function(x) ( difference < x ) * 1L ) ]

注意列名(:= 之前)表示为向量,列内容表示为列表的元素(lapply 的输出)。

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多