【问题标题】:Function write.csv returns an error函数 write.csv 返回错误
【发布时间】:2013-03-15 13:49:15
【问题描述】:

R 函数write.csv 返回错误。

这是我要写的data.frame:

> VaRStats
               A Index    B Index      C Index
Daily VaR     -0.65006    -0.50391     -0.5557
Daily CVaR    -0.75679    -0.57491    -0.65174
5 Days VaR     -1.4204     -1.0077     -1.2269

这是VaRStats的类:

> class(VaRStats)
[1] "data.frame"

这是VaRStatsdput() 输出:

> dput(VaRStats)
structure(list(`JWFXA Index` = structure(list(`NA` = -0.650061101980277, 
    `NA` = -0.756791819719978, `JWFXA Index` = -1.42035638029947), .Names = c(NA, 
NA, "JWFXA Index")), `CCYT1 Index` = structure(list(`NA` = -0.503912574910245, 
    `NA` = -0.574907003405759, `CCYT1 Index` = -1.00773735259718), .Names = c(NA, 
NA, "CCYT1 Index")), `FX Multistrategy Index` = structure(list(
    `NA` = -0.555699685451229, `NA` = -0.651738541799373, `FX Multistrategy Index` = -1.22688572580144), .Names = c(NA, 
NA, "FX Multistrategy Index"))), .Names = c("JWFXA Index", "CCYT1 Index", 
"FX Multistrategy Index"), row.names = c("Daily VaR", "Daily CVaR", 
"5 Days VaR"), class = "data.frame")

write.csv函数产生的错误

> write.csv(VaRStats, "SummaryStats.csv")
Error in write.table(x, file, nrow(x), p, rnames, sep, eol, na, dec, as.integer(quote),  : 
  type 'list' not implemented in 'EncodeElement'

这怎么可能?

【问题讨论】:

  • 对我来说很好用...一定有你没有提供的缺失部分。
  • 在这里也可以正常工作。也许您可以在您的VaRStats 对象上复制/粘贴dput
  • 我最近遇到了类似的奇怪错误 - 只需重新启动 R 即可修复
  • lapply(VaRStats,class) 建议您的列是列表。这可能就是问题所在。
  • 你的结构并不是真正的data.frame。它刚刚被分配了“data.frame”类。就像 ndoogan 所说,您的列是列表而不是数字。您可以通过执行 sum(VaRStats) 轻松看到这一点,这不起作用。

标签: r csv


【解决方案1】:

在这里你可以简单地做到这一点:

      write.csv(as.matrix(dd), "SummaryStats.csv")

这行得通,因为你所有的列都是数字的。

read.csv("SummaryStats.csv")
         X JWFXA.Index CCYT1.Index FX.Multistrategy.Index
1  Daily VaR  -0.6500611  -0.5039126             -0.5556997
2 Daily CVaR  -0.7567918  -0.5749070             -0.6517385
3 5 Days VaR  -1.4203564  -1.0077374             -1.2268857

编辑

这个解决方案是正确的。

如果您的列表中有一个字符串:

dd[1,1] <- 'a'

as.matrix(dd)
           JWFXA Index CCYT1 Index FX Multistrategy Index
Daily VaR  "a"         -0.5039126  -0.5556997            
Daily CVaR -0.7567918  -0.574907   -0.6517385            
5 Days VaR -1.420356   -1.007737   -1.226886 

但使用 as.numeric 会失败或至少转换为 NA

sapply(dd, as.numeric)
     JWFXA Index CCYT1 Index FX Multistrategy Index
[1,]          NA  -0.5039126             -0.5556997
[2,]  -0.7567918  -0.5749070             -0.6517385
[3,]  -1.4203564  -1.0077374             -1.2268857
Warning message:

【讨论】:

  • 很好(而且很重要)的跟进!
【解决方案2】:

由于无法解释的原因,您的数据框列是列表,而不是向量。您可以使用以下命令将数据框转换回“正常”格式:

df <- sapply(VaRStats, as.numeric)
rownames(df) <- rownames(VarStats)
write.csv(df, "yourfile.csv")

【讨论】:

  • (+1) 但我认为 agstudy 的解决方案在这里要简单得多。
  • @Arun 我同意你的看法。请投票并接受agstudy的回答!
【解决方案3】:

您的列是列表。它们应该是向量。试试这个。

VaRStats<-sapply(VaRStats,unlist)
write.csv(VaRStats,file="...")

【讨论】:

  • 这里最初误用了lapply,后来改成了sapply。
  • (+1) 你可以使用do.call(rbind, lapply(...)) (或者 cbind,如果反过来的话)。
【解决方案4】:

你能举一个可重现的例子吗,我的猜测是你有row.namescol.names的问题,也使用write.table,这样你就可以根据需要设置所有参数

编辑:我有同样的问题看看str !!!

R) str(test)
'data.frame':   3 obs. of  3 variables:
 $ JWFXA Index           :List of 3
  ..$ NA         : num -0.65
  ..$ NA         : num -0.757
  ..$ JWFXA Index: num -1.42
 $ CCYT1 Index           :List of 3
  ..$ NA         : num -0.504
  ..$ NA         : num -0.575
  ..$ CCYT1 Index: num -1.01
 $ FX Multistrategy Index:List of 3
  ..$ NA                    : num -0.556
  ..$ NA                    : num -0.652
  ..$ FX Multistrategy Index: num -1.23

您的数据不是公共data.frame

@juba 有一个很好的解决方法,使用 lapply 将每个列表转换为 numeric 向量

【讨论】:

    【解决方案5】:

    尝试检查每个列的变量类型。写csv不喜欢list类型的列。

    例如,在《星球大战》数据集中,电影、车辆和星际飞船的列属于列表类型:

    > data(starwars)
    > class(starwars$vehicles)
    [1] "list"
    > class(starwars$starships)
    [1] "list"
    > class(starwars$films)
    [1] "list"
    

    【讨论】:

      【解决方案6】:

      试试这个

      df <- do.call(rbind.data.frame, VaRStats)
      
      write.csv(df, "path\VaRStats.csv")
      

      第一行从列表转换为数据框,然后你可以导出到csv文件

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 1970-01-01
        • 2018-06-16
        • 2014-07-24
        • 2021-12-13
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多