【问题标题】:Assign names from one list to another将名称从一个列表分配给另一个
【发布时间】:2011-09-23 16:24:22
【问题描述】:

我有一堆动态创建的回归存储在一个名为regressions 的列表中。现在我想有效地重命名它们的系数。到目前为止,我所拥有的是这个有效的循环:

for (i in 1:length(params[,1])){
names(regressions[[i]]$coefficients)[pos] <- paste(params[i,1],".lag",params[i,2],sep="")
}

我已经尝试了很长一段时间,以便在函数的帮助下更普遍地完成这项工作,因为这不是我拥有的唯一回归列表。但是我无法让其他任何工作。这里基本基于 lapply 的其他一些尝试:

 correctNames <- function(reglist,namevec,pos){
 names(reglist[[i]]$coefficients)[pos] <- as.character(namevec)
}

lapply(regressions,correctNames(reglist,namevec,pos),
reglist=regressions,namevec=params[,1],pos=2)

另一个尝试是编写一个带有 for 循环的函数,该循环在内部也可以作为 print 显示,但不会全局分配名称(存储回归列表的位置)。

correctNames <- function(reglist,pos,namevec){
for (i in 1:length(params[,1])){
names(reglist[[i]]$coefficients)[pos] <- paste(namevec,".lag",namevec,sep="")
}
#this test proves it's work inside the function... 
print(reglist[[10]]
}

啊,让我休息一下。

【问题讨论】:

  • 我没有投反对票,但我要注意的是,您没有说出了什么问题尝试没有成功。
  • 是的。最后一种方法不起作用,因为当我在控制台上调用回归时,名称保持不变。这甚至没有让我感到惊讶,我只是错过了如何在这种情况下将其分配给全球环境。另一个返回以下错误:error in correctNames(reglist, namevec, pos) : object 'namevec' not found

标签: r assign lapply


【解决方案1】:

第一个版本的“correctNames”函数中没有“i”;而且您可能没有意识到您没有将其分配给“回归”,而只是分配给回归对象的副本。试试吧:

correctNames <- function(reglist,namevec,pos){
  names(reglist$coefficients)[pos] <- as.character(namevec)
   return(reglist)                          }
newregs <- mapply(correctNames,  
                     reglist=regressions, 
                     namevec=as.character(params[,1]), 
                     MoreArgs= list( pos=2))

在看到 Ramnath 的注释并注意到代码确实有效但为“参数”提供了片状名称后,我查看了参数并发现这是一个因素,因此将 mapply 调用中的参数更改为as.character(params[,1]).

> newregs[1,1]
[[1]]
(Intercept)     log(M1) 
  -5.753758    2.178137 

【讨论】:

  • 澄清一下,这个函数的工作原理是函数返回修改后的对象;你原来的功能没有。
  • 你们对我错过的事情完全正确。我最好收工。
【解决方案2】:

如果这是您的earlier question 的后续行动,那么我会这样做

coefs = plyr::ldply(regressions, coef)
coefs = transform(coefs, reg_name = paste(x, '.lag', l, sep = ""))[,-c(1, 2)]
names(coefs) = c('intercept', 'reg_coef', 'reg_name')

这给了你

 intercept reg_coef     reg_name
1 -5.753758 2.178137 log(M1).lag0
2  7.356434 7.532603      rs.lag0
3  7.198149 8.993312      rl.lag0
4 -5.840754 2.193382 log(M1).lag1
5  7.366914 7.419599      rs.lag1
6  7.211223 8.879969      rl.lag1
7 -5.988306 2.220994 log(M1).lag4
8  7.395494 7.127231      rs.lag4
9  7.246161 8.582998      rl.lag4

【讨论】:

  • 光滑。只需要对 ldply 和其他 plyr 函数的强大功能多一点经验。我看到它有很大帮助。尽管如此,我仍然想知道是否也有一个 lapply 解决方案。我一直问的原因是,我意识到我在几个月前尝试用 lapply 解决另一个问题,然后我有一个 R 休息时间。所以我想说的是,我的直觉可能会让我回到基于 lapply 的解决方案。也许我需要改变它,但也许也有一个 lapply 解决方案。
  • 我无法确定您是否对 mapply 解决方案感到满意,因为您不接受它,但会注意到 lapply 在这里更难使用,因为您传递了两个多值项目: “回归”列表和 params[,1] 向量,它们需要匹配。您的 for 循环正在使用索引执行 htat 而 mapply 隐式执行此操作
  • 嗯。我只能接受一个,也只能发出一个赞成票。好吧,我想我必须接受 mapply 解决方案,因为我向那个方向提出了更多要求。尽管如此,在我的特殊情况下,Rammath 是正确的——这是一个后续行动,这个答案更适合。我只是错失了这次提出一个好问题的机会,试图让它更笼统。
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2017-10-29
  • 2019-07-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多