【问题标题】:R write list to CSV line by lineR逐行将列表写入CSV
【发布时间】:2018-06-15 16:33:16
【问题描述】:

我在 R 中有以下代码:

library(party)
dat = read.csv("data.csv", header = TRUE)

train <- dat[1:1000, ]
test <- dat[1000:1200, ]

output.tree <- cforest(t_class ~ var1 + var2,
                       data = train)

train_predict <- predict(output.tree, newdata = test, OOB=TRUE, type = "prob")

for (name in names(train_predict))
{
  p <- (train_predict[[name]][1:3])
  write.table(p, file = "result.csv",col.names = FALSE, append=TRUE)
}

我正在尝试将随机森林预测的结果写入 csv 文件。

结果 train_predict 如下所示:

当我运行上面的代码时,它只将每行的第一列写入 csv,而不是全部写入三个。

如何将列表的所有三列写入文件?

R 中还有一种方法可以在写入之前清除 csv,以防万一里面已经有东西了?

【问题讨论】:

    标签: r list csv


    【解决方案1】:

    您可以转换为 data.frame 并一次全部写入,而不是串行写入:

    生成与您发布的内容相似的虚假数据:

    fakeVec <- function(dummy) t(setNames(rnorm(3), letters[1:3]))
    my_list <- lapply(0:4, fakeVec)
    names(my_list) <- 6000:6004
    

    这是假数据:

    $`6000`
                  a          b         c
    [1,] -0.2444195 -0.2189598 -1.442364
    
    $`6001`
                 a        b          c
    [1,] 0.2742636 1.068294 -0.8335477
    
    $`6002`
                a        b         c
    [1,] -1.13298 1.927268 -2.123603
    
    $`6003`
                 a        b            c
    [1,] 0.8260184 1.003259 -0.003590849
    
    $`6004`
                  a         b         c
    [1,] -0.2025963 0.1192242 -1.121807
    

    然后转换格式:

    # crush to flat matrix
    my_mat <- do.call(rbind, my_list)
    # add in list names as new column
    my_df <- data.frame(id = names(my_list), my_mat)
    

    现在你有一个这样的data.frame:

        id          a          b            c
    1 6000 -0.2444195 -0.2189598 -1.442364429
    2 6001  0.2742636  1.0682937 -0.833547659
    3 6002 -1.1329796  1.9272681 -2.123603334
    4 6003  0.8260184  1.0032591 -0.003590849
    5 6004 -0.2025963  0.1192242 -1.121807439
    

    您可以直接写入文件:

    write.csv(my_df, 'my_file.csv', row.names=F)
    

    【讨论】:

    • 对于具有不同行数的数据框列表呢?
    • 行数应该没有区别。你仍然可以使用 do.call(rbind, my_list)。还有 data.table::rbindlist 和 dplyr::bind_rows
    【解决方案2】:

    这个怎么样?

    temp = list(x = data.frame(a = "a", b = "b", c = "c"),
            y = data.frame(d = "d", e = "e", f = "f"),
            z = data.frame(g = "g", h = "h", i = "i"))
    
    for (i in 1:length(temp)) {
      write.table(temp[[i]], "temp.csv",col.names = F, append = T)
    }
    

    关于清除 csv。如果我正确理解了您的问题,请删除 append = T?

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2012-12-17
      • 2017-05-21
      • 2016-09-14
      • 2019-12-18
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多