在R的data.table中使用ifelse和apply函数

3

我有以下的data.table对象:

USER    active  rate   day    # of elements by hour
4q7C0o  1         1.48  1       c(0, 0, 0, 0, 0, 0, 5, 98, 167, 211, 246)
2BrKY63 1         0.5   3       c(0, 0, 0, 0, 0, 0, 0, 5, 15, 24, 89, 187) 
3drUy6I 1         2.58  5       c(0, 0, 0, 0, 0, 0, 0, 0, 1, 112, 265, 309) 
G5ALtO  1         1.1   7       c(0, 0, 0, 0, 0, 0, 0, 2, 20, 153, 170)

每个“#按小时元素数量”列的元素都是一个长度不同的列表。我想对每个列表的每个元素应用函数“pexp()”(例如,对于第一个列表的第一个元素,应用pexp(0,rate = 1.48)以及对于第一个列表的最后一个元素,应用pexp(246, rate = 1.48)),如果发生小于“x”的值,则在新列中显示它。类似于:

DT[, ifelse(any(lapply( of elements by hour, pexp, rate = rate) < x), 'no.usable','usable' )  ,]

然而我不知道如何在data.table中以简短的方式完成这项任务。

2个回答

6

pexp是指数概率密度函数,它是单调递增且容易求逆。如果满足速率λ的条件,则符合您的要求:

# elem > 1 / rate * log(rate / x)

因此,我们只需要查看每个列表中的最大值并在那里检查条件。
有了这个想法,我们可以这样做:
DT[ , fifelse(sapply(`# elem`, max) > 1/rate*log(rate/x), 'no.usable', 'usable')]

感谢@MichaekChirico! - Oliver

2

这里有一种使用Map的选项,我们将"每小时元素数"的每个元素应用pexp函数,并使用相应的'rate'列值。

DT[, c('usable', 'no.usable')[unlist(Map(function(x, y)
     any(pexp(x, rate = y) < x))   `# of elements by hour`, rate)) + 1]]

或者使用 fifelse
DT[, fifelse(unlist(Map(function(x, y)
     any(pexp(x, rate = y) < x))   `# of elements by hour`, rate)), 
          'no.usable', 'usable')]

1
非常感谢 @akrun。 - Oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接