小编mjr*_*eed的帖子

避免 R 中的函数名冲突

我最近遇到了一种情况,由于引入了dplyr库,现有的 R 代码被破坏了。具体来说,lag来自 stats 包的函数正在被dplyr::lag. 该问题先前已在此处记录,但未提供解决方法。对 R 命名空间和环境的研究导致了 2 种可能的解决方案,在我看来都不是很强大:

  1. 确保package:stats首先出现在search()路径中,以便lag解析为 stats 包中的函数。
  2. lag我代码中的所有引用更改为stats::lag

我的问题是这些其他解决方案是否可行:

  1. dplyr以某种方式加载包以强制它位于“私有”命名空间中,在该命名空间中只能通过::操作符访问其对象。
  2. 库加载时强制lag解析为stats::lag. 这可以通过删除dplyr::lag或覆盖搜索路径来完成(类似于 C++ using namespace::function指令。)

namespaces r dplyr

7
推荐指数
1
解决办法
1120
查看次数

R data.table有序列查找

我有一个带有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中使用变量名称这一事实.(为简洁起见,我不在此处包含该解决方案.)

欢迎提出任何改进建议.

r data.table

3
推荐指数
1
解决办法
127
查看次数

标签 统计

r ×2

data.table ×1

dplyr ×1

namespaces ×1