【问题标题】:R and 'plm' package: how to use lapply to loop through columns of a 'pdata.frame' objectR 和“plm”包:如何使用 lapply 循环遍历“pdata.frame”对象的列
【发布时间】:2018-07-12 12:05:48
【问题描述】:

我正在使用“plm”包进行一些模拟。我需要对给定数据集中的所有变量进行“内部”转换。 “for”循环可以正常工作,而“lapply”版本则不行。我将数据集创建为:

library(plm)
data<- data.frame(replicate(10, runif(100)))
pdata <- pdata.frame(data, index=10)
varlist <- names(pdata)[names(pdata)!=("id") & names(pdata)!="time"]

我可以对单个变量运行“内部”转换,例如:Within(pdata$X1) 有效。或者我可以运行一个“for”循环,它也可以:

pdata.with2 <- pdata[, varlist]
for(i in 1:ncol(pdata.with2)){
    pdata.with2[,i]= Within(pdata[,i])
}

lappy版本失败:

pdata.with  <-  lapply(pdata[, varlist], Within)

并给出错误:“UseMethod("Within") 中的错误: 'Within' 没有适用于类“c('double', 'numeric')”的对象的方法。似乎“lapply”循环遍历变量的方式错过了一些使“pseries”类的列成为“数字”的属性。举个例子

class(pdata$X1)

给了

[1] "pseries" "numeric"

同时

lapply(pdata[, varlist], class)

给予

$X1
[1] "numeric"
...

我的问题:有没有办法在“pdata.frame”对象上使用“lapply”?

【问题讨论】:

    标签: r apply plm


    【解决方案1】:

    lapply 以不同的方式访问 pdata.frame 是正确的,这是因为 pdata.frame 当前是如何定义的(with() 也是如此),您可以在其中看到您已经通过两种不同的方式查看类属性来展示。

    如果您想使用lapply,您可以先通过as.list (plm:::as.list.pdata.frame) 的pdata.frame 方法使用keep.attributes 选项强制到一个列表,如下所示:

    res <- data.frame(lapply(as.list(pdata[ , varlist], keep.attributes = TRUE), Within))
    all.equal(pdata.with2, res, check.attributes = FALSE)
    

    【讨论】:

    • 感谢您的回答。不幸的是,它似乎对我不起作用。我收到相同的错误消息。我试过了
    • res &lt;- data.frame(lapply(as.list(pdata[ , varlist], keep.attributes = TRUE), class)) res 我仍然只得到“数字”属性。我的 plm 版本是 1.5-12 抱歉“拆分”评论,我是堆栈溢出的新手,还是有点笨拙
    • 我将plm升级到1.6-6,现在一切正常。在 1.5-12 中,as.list 方法未定义。再次感谢您的帮助
    猜你喜欢
    • 2020-10-16
    • 2020-01-28
    • 2023-03-28
    • 2022-01-14
    • 2016-06-28
    • 2014-02-22
    • 1970-01-01
    • 2010-12-07
    • 2012-10-16
    相关资源
    最近更新 更多