gpt4 book ai didi

r - 如何在 data.table 中的字符向量上使用 apply 函数

转载 作者:行者123 更新时间:2023-12-01 13:35:44 24 4
gpt4 key购买 nike

我正在尝试了解我的数据的可用性,这可能看起来像:

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]

但实际上,我想对很多变量都这样做。然而,我为此所做的所有尝试都失败了,因为我很难将列向量传递给数据表。我的猜测是它朝着 this 的方向发展。或 this但我尝试使这些解决方案适用于列向量的尝试失败了。

例如,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)

最佳答案

我们可以循环(lapply)在按“id”分组后在 .SDcols 中指定的感兴趣的列,创建非 NA 元素的逻辑索引(!is.na),找到数字索引(which),获取范围(即minmax),使用它来对“时间”列进行子集化并将时间元素粘贴在一起。

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

关于r - 如何在 data.table 中的字符向量上使用 apply 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43476986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com