【问题标题】:How to name columns based on the number of iteration in a loop (in R)?如何根据循环中的迭代次数(在 R 中)命名列?
【发布时间】:2021-03-25 15:30:32
【问题描述】:

我想根据 R 循环中的迭代次数来命名。例如,我希望数据框中的列被称为“column_1”、“column_2”等等。到目前为止,我已经尝试了以下代码,但它不起作用:

df = data.frame(rep(0, 5))
for (i in 1:5) {
        
        df = cbind(df, paste0("column_", i) = rnorm(5))
        
}

另外,请注意,如果它确实有效,我需要使用以下方法删除第一列:

df = df[,-1]

避免创建此类初始列的最佳方法是什么?我创建它是因为空数据框df = data.frame() 在使用df = cbind(df, rnorm(5)) 时不会占用新列,因为行数不匹配。

【问题讨论】:

    标签: r loops for-loop


    【解决方案1】:

    这样试试

    df = list()
    for (i in 1:5) {
            
        df[[paste0("column_", i)]] =  rnorm(5)
            
    }
    
    do.call('data.frame', df)
         column_1   column_2   column_3   column_4    column_5
    1 -0.47624689  0.1192452  1.6756969 -0.5739735  0.05974994
    2 -0.78860284  0.2436874 -0.4411632  0.6179858 -0.70459646
    3 -0.59461727  1.2324759 -0.7230660  1.1098481 -0.71721816
    4  1.65090747 -0.5160638 -1.2362731  0.7075884  0.88465050
    5 -0.05402813 -0.9925072 -1.2847157 -0.3636573 -1.01559258
    

    或者,为了预先分配df,我也可以试试这个

    df        = vector('list', 5)
    names(df) = paste0("column_", 1:5)
    for(i in 1:5) df[[i]] = rnorm(5)
    do.call('data.frame', df)
    

    【讨论】:

    • 有没有办法避免添加初始列?我觉得它效率不高,我应该避免这种习惯:)
    • 编辑应该避免使用初始列,但这确实是低效。事实上,在 R 中避免循环预分配确实是一种不好的做法。
    【解决方案2】:

    现有解决方案的替代方案,您可以使用以下方法预先分配适当的行数:

    len <- 5
    df <- data.frame(numeric(len))
    
    for (i in 1:10){
      df[paste0("column_",i)] <- rnorm(len)
    }
    
    df[[1]] <- NULL
    df
    

    【讨论】:

    • 感觉跟初始化df = data.frame(rep(0, 5))一样低效
    猜你喜欢
    • 2020-05-09
    • 2021-11-25
    • 2022-01-17
    • 2020-01-24
    • 2019-03-24
    • 2014-06-01
    • 2021-12-22
    • 1970-01-01
    • 2022-12-19
    相关资源
    最近更新 更多