【问题标题】:Iteratively adding new columns to a list of data frames迭代地将新列添加到数据框列表中
【发布时间】:2015-09-06 01:45:20
【问题描述】:

我正在尝试编写一些代码来遍历数据框列表,向每个数据框添加一个新列,该列包含与旧列相同的值但移动了 1。此列中的第一个值将是 NA。以下是我的代码:

for(dataframe in 1:length(listOfDataFrames)){
    newColumn <- c(NA)
    for(row in 1:(nrow(listOfDataFrames[[dataframe]]) - 1)){
        newColumn <- append(newColumn, listOfDataFrames[[dataframe]]$oldColumn[row])
    }
    mutate(listOfDataFrames[[i]], newColumn = newColumn)
}

但是,当我在 R 中执行此代码时,我在第一个数据帧上收到错误:

replacement has 894 rows, data has 895 

什么可能导致此错误?对不起,如果这是一个简单的问题,我不是 R 专家。

谢谢!

【问题讨论】:

    标签: r list for-loop dataframe


    【解决方案1】:

    你的代码是你在 R 中应该避免的东西的集中:

    1. 当您可以使用 lapply 或更一般的 xxapply 系列时,请勿使用 for
    2. 不要在循环内附加 data.frame 的行。这非常低效。你应该预先分配。使用 lapply 将为您解决问题。
    3. 不要在函数内部使用$。您应该使用[ 运算符
    4. 如果可以以矢量化方式执行,则无需遍历 data.frame。

    这里我会怎么做:

    lapply(listOfDataFrames, function(DX){
    
            ## I assume that your DX has and "oldColum" variable
            transform(DX,newColumn =c(NA,head(oldColumn,-1))
    
    })
    

    【讨论】:

    • 谢谢!这对我有用。我不习惯 lapply 函数,所以我本能地使用了 for 循环,但你的代码更好!我没有考虑使用 head 函数来创建新列。关于$,为什么它被认为是坏的?我在教程中看到它在函数内部使用,例如:stat.berkeley.edu/~spector/R.pdf
    • 我不看教程,但由于部分匹配,$ 的使用更宽松(例如输入:ll &lt;- list(yyaa=1); ll$y),因此它是错误的来源/错误。最好只将它用于 R 控制台。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2015-08-28
    • 2019-06-09
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多