【问题标题】:Mantain values >=0 in colum of nested list in data.table R在data.table R中的嵌套列表列中保持值> = 0
【发布时间】:2020-04-25 13:49:59
【问题描述】:

我有以下data.table 对象:

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

我想在# of elements by hour 列的每个列表中只保留 >= 0 的元素,以便获得如下内容:

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

我尝试了以下方法,但它花费的时间太长,当我使用少量数据时,它会产生一些奇怪的结果:

DT[, # of elements by hour[which(unlist(# of elements by hour) >= 0)], day ]

关于我做错了什么有什么建议吗?还是更快的更好方法?

【问题讨论】:

  • 您可以使用dput 共享数据吗?
  • @RonakShah,这需要很长时间,但是当我停止它时,它显然将每个数字作为 Long(例如 98L)而不是双精度。我不知道这是否会导致问题?

标签: r list data.table


【解决方案1】:

你可以试试:

library(data.table)
dt[, elements_by_hour := lapply(elements_by_hour, function(x) x[x >= 0])]

【讨论】:

    【解决方案2】:

    我们也可以

    library(dplyr)
    library(purrr)
    dt %>%
       mutate(elements_by_hour = keep(elements_by_hour, ~ .x > 0))
    

    或者

    dt %>%
       mutate(elements_by_hour = map(elements_by_hour, ~ .x[.x > 0]))
    

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多