如何在data.table的每一行中应用函数

new*_*bie 6 r data.table

假设我有以下内容

dt <- data.table(a=c(T,T,F,F), b= c(T,F,T,F))
Run Code Online (Sandbox Code Playgroud)

返回,

       a     b
1:  TRUE  TRUE
2:  TRUE FALSE
3: FALSE  TRUE
4: FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用function(x) min(which(x))来确定TRUE中每一行的第一行dt,但没有奏效。我期望的结果将是

       a     b index
1:  TRUE  TRUE     1
2:  TRUE FALSE     1
3: FALSE  TRUE     2
4: FALSE FALSE  9999
Run Code Online (Sandbox Code Playgroud)

,其中索引列表示第一个的位置,TRUE当该行仅包含 FALSE 时使用 9999

仅供参考:在真实数据中,我有大约 50 列包含 TRUE 和 FALSE

你能给我建议吗?

akr*_*run 5

对于 50 列,最好使用 max.col

dt$index <- max.col(dt, 'first') *(!!rowSums(dt))
Run Code Online (Sandbox Code Playgroud)

或者正如@David Arenburg 所提到的,更惯用的代码是

dt[, indx := max.col(.SD,ties.method="first")*(!!rowSums(.SD))]
Run Code Online (Sandbox Code Playgroud)

如果我们需要 9999

 (max.col(dt)*(!!rowSums(dt))) + (!rowSums(dt))*9999
Run Code Online (Sandbox Code Playgroud)

  • `dt[, indx := max.col(.SD,ties.method="first")*(!!rowSums(.SD))]` 可能更惯用 (4认同)
  • 虽然这整个事情首先可能更适合矩阵,因为 `max.col` 和 `rowSums` 都转换为矩阵。 (3认同)