如何使用依赖于另一列的序列替换data.table列?

时间:2016-12-05 11:33:19

标签: r data.table

我有两列IDTrial。 ID列填充 NA Trial列从0开始并以一个arbritary数字结束(例如1232),然后下一个试验序列从0开始等。我的目标是为每个系列的试验创建一个唯一的ID。

我是R的新手并意识到有几种方法可以解决这个问题:

  • 使用两个嵌套循环
  • lapply(或rapply?)与抽象(?)函数调用或句柄一起使用
  • 使用nextElem包中的iterator以及第1或第2点
  • 首先生成列表并替换 第二步中的值,例如基于子集上的某种迭代使用两个seq()ex_data[subset]

到目前为止,我已经发现参加人数是:

N <- dim(filter(ex_data, Trial == 0))[1]

或更优雅:

N <- count(ex_data[Trial == 0])

特别是,这是我正在努力的条件部分,以及最像R的解决方案。

伪代码:

IDs are 1:N

while IDs < N+1
    current + 1
    while column Trial is > 0
        ID is IDs[current]
        next Trial
    next Trial

如何决定何时在apply系列等更紧凑的表达式上使用循环?具体来说,如何基于几乎循环的列生成新序列?

Example Data (for generation see below)


      id  t
 [1,] NA  0
 [2,] NA  1
 [3,] NA  2
 [4,] NA  3
 [5,] NA  4
 [6,] NA  5
 [7,] NA  0
 [8,] NA  1
 [9,] NA  2
[10,] NA  3
[11,] NA  4
[12,] NA  5
[13,] NA  6
[14,] NA  7
[15,] NA  0
[16,] NA  1
[17,] NA  2
[18,] NA  3
[19,] NA  4
[20,] NA  5
[21,] NA  6
[22,] NA  7
[23,] NA  8
[24,] NA  9
[25,] NA 10
[26,] NA 11
[27,] NA 12


# Generate Example Data
t <- c(0:5, 0:7, 0:12)
id <- rep(NA, length(t))
dta <- cbind(id, t)
# Optional (using dtplyr)
# dta <- tbl_df(dta)

1 个答案:

答案 0 :(得分:4)

我们可以使用data.table方法

ex_data[, ID := cumsum(!Trial)]