【问题标题】:How to use apply function over character vectors inside data.table如何在 data.table 中的字符向量上使用应用函数
【发布时间】:2017-04-18 16:00:14
【问题描述】:

我正在尝试了解我的数据的可用性,可能如下所示:

DT <- data.table(id=rep(c("a","b"),each=20),time=rep(1991:2010,2),
             x=rbeta(40,shape1=1,shape2=2),
             y=rnorm(40))
#I have some NA's (no gaps):
DT[id=="a"&time<2000,x:=NA]
DT[id=="b"&time>2005,y:=NA]

但当然要大得多。理想情况下,我希望看到这样的表格:

       a         b
x 2000-2010  1991-2010
y 1991-2010  1991-2005

所以非缺失最小值到非缺失最大值时间段。我可以得到一个变量:

DT[,availability_x:=paste0(
        as.character(min(ifelse(!is.na(x),time,NA),na.rm=T)),
        "-",
        as.character(max(ifelse(!is.na(x),time,NA),na.rm=T))),
    by=id]

但实际上,我想对许多变量都这样做。然而,我所有的尝试都失败了,因为我很难将列向量与数据表通信。我的猜测是它朝着thisthis 的方向发展,但我尝试将这些解决方案适应列向量的尝试失败了。

例如,apply 函数似乎不会评估字符向量的元素:

cols <- c("x","y")

availabilityfunction <- function(i){
  DT[,paste0("avail_",i):=paste0(
       as.character(min(ifelse(!is.na(i),time,NA),na.rm=T)),
       "-",
       as.character(max(ifelse(!is.na(i),time,NA),na.rm=T))),
    by=id]}
lapply(cols,availabilityfunction)

【问题讨论】:

  • 另一种选择:melt(DT, id = c("id", "time"))[!is.na(value), as.list(summary(time)), by=.(id, variable)]range 代替 summary
  • 这也很好,有助于我的理解。谢谢!

标签: r data.table


【解决方案1】:

我们可以循环(lapply)通过'id'分组后.SDcols中指定的感兴趣的列,创建非NA元素的逻辑索引(!is.na),找到数字索引(@987654324 @),得到range(即minmax),用它来子集“时间”列和paste时间元素。

DT[, lapply(.SD, function(x) paste(time[range(which(!is.na(x)))], 
                      collapse="-")), by = id, .SDcols = x:y]
#   id         x         y
#1:  a 2000-2010 1991-2010
#2:  b 1991-2010 1991-2005

【讨论】:

  • 这看起来真不错。但我收到以下错误:Error in time[range(which(!is.na(x)))] : object of type 'closure' is not subsettable 当我寻找不存在的东西时通常会得到这个错误。也许是函数中 x 和 data.table 的双重命名?
  • @PeterPan 这个错误是基于你展示的例子吗?如果是这样的话,它对我来说很好。我正在使用data.table_1.10.4
  • 可能你没有一个名为 time 的列来测试代码,所以它正在寻找该名称的函数而不是 @PeterPan
  • @akrun 是的,但有data.table 1.9.6 和更新错误,嗯...我会在修复此问题后回复您。到目前为止谢谢!
  • @akrun 是的!就是这样。为cols &lt;- c("x","y","time") 之类的对象添加时间并将最后一个参数更改为.SDcols = cols 可以解决问题。谢谢!
猜你喜欢
  • 2016-02-27
  • 2020-05-04
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多