【问题标题】:using apply within ifelse R data.table在 ifelse R data.table 中使用 apply
【发布时间】:2020-04-20 04:40:06
【问题描述】:

我有以下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)

# of elements by hour 列的每个元素都是一个长度不同的列表。我想将函数 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 中快速完成此操作。

【问题讨论】:

    标签: r list function data.table


    【解决方案1】:

    这是Map 的一个选项,我们在"# of elements by hour" 的每个元素上应用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')]
    

    【讨论】:

    • 非常感谢@akrun
    【解决方案2】:

    pexp 是指数密度,它是单调且容易可逆的。如果满足以下条件,则您的条件满足速率 l:

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

    因此我们只需要查看每个列表的最大个数并检查那里的条件。

    考虑到这一点,我们可以这样做:

    DT[ , fifelse(sapply(`# elem`, max) > 1/rate*log(rate/x), 'no.usable', 'usable')]
    

    【讨论】:

    • 谢谢@MichaekChirico!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2013-06-19
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多