【发布时间】:2015-10-19 09:04:37
【问题描述】:
假设我有以下内容
dt <- data.table(a=c(T,T,F,F), b= c(T,F,T,F))
返回,
a b
1: TRUE TRUE
2: TRUE FALSE
3: FALSE TRUE
4: FALSE FALSE
我曾尝试使用function(x) min(which(x)) 来确定@987654325@ 中每一行的第一个TRUE,但它不起作用。我期望的结果是
a b index
1: TRUE TRUE 1
2: TRUE FALSE 1
3: FALSE TRUE 2
4: FALSE FALSE 9999
,其中索引列表示第一个TRUE的位置,当该行仅包含FALSE时使用9999
仅供参考:在真实数据中,我有大约 50 列包含 TRUE 和 FALSE
你能给我一些建议吗?
【问题讨论】:
-
试试
dt[, index := ifelse(a, 1, ifelse(b, 2, 9999))]我不确定 50 列的情况。你是说你有 TRUE、FALSE、50 列。在这种情况下,max.col(dt, 'first')*(!rowSums(dt))就是这样 -
@TimBiegeleisen 只是在评论我的空闲时间。
-
如果您不介意
0而不是9999作为所有FALSE的指示符,请尝试使用max.col(dt,ties.method="first")*(rowSums(dt)!=0)(之后您也可以将其设置为 9999)。 -
@nicola 正打算提出相同的建议。虽然
rowSums在这里可能是一个开销。 -
@DavidArenburg 还有
max.col是。他们都强迫matrix。如果他的对象是矩阵,我提出的解决方案会更快。
标签: r data.table