我最近遇到了一种情况,由于引入了dplyr库,现有的 R 代码被破坏了。具体来说,lag来自 stats 包的函数正在被dplyr::lag. 该问题先前已在此处记录,但未提供解决方法。对 R 命名空间和环境的研究导致了 2 种可能的解决方案,在我看来都不是很强大:
package:stats首先出现在search()路径中,以便lag解析为 stats 包中的函数。lag我代码中的所有引用更改为stats::lag我的问题是这些其他解决方案是否可行:
dplyr以某种方式加载包以强制它位于“私有”命名空间中,在该命名空间中只能通过::操作符访问其对象。lag解析为stats::lag. 这可以通过删除dplyr::lag或覆盖搜索路径来完成(类似于 C++ using namespace::function指令。)我有一个带有id列和多列的R data.table,指定有序的阈值级别和相应的值.我想要做的是查找第一级的每一行,该行大于或等于该id的参数并返回相应的值.
这是一个示例数据集.
DT<-data.table(id=c("Obs1","Obs2"),
level.1=c(1,1),level.2=c(2,4),level.3=c(3,8),
val.1=c(10,10),val.2=c(20,30),val.3=c(30,50))
DT
id level.1 level.2 level.3 val.1 val.2 val.3
1: Obs1 1 2 3 10 20 30
2: Obs2 1 4 8 10 30 50
Run Code Online (Sandbox Code Playgroud)
所以如果查找参数:
params<-list("Obs1"=2.5,"Obs2"=1)
Run Code Online (Sandbox Code Playgroud)
返回的值应为:
c(30,10).
Run Code Online (Sandbox Code Playgroud)
我还希望级别和值的数量有些随意,尽管它们将满足类似于示例的命名约定
我可以使用几个步骤来解决这个问题,但它非常难看并且计算效率可能不高:
level.names<-colnames(DT)[grep("level",colnames(DT))]
val.names<-colnames(DT)[grep("val",colnames(DT))]
setkey(DT,id)
idx<-DT[,grep(TRUE,lapply(.SD,function(y)((params[[id]] <= y))))[1],
.SDcols=level.names,by=id]
values<-ifelse(is.na(idx$V1),as.numeric(NA),DT[,get(val.names[idx[id,V1]]),by=id]$V1)
Run Code Online (Sandbox Code Playgroud)
我之前使用plyr :: ddply更清晰地使用data.frames解决了这个问题,并且我可以在data.frame中使用变量名称这一事实.(为简洁起见,我不在此处包含该解决方案.)
欢迎提出任何改进建议.