【问题标题】:Converting Rdata files to CSV - Error in data.frame arguments imply differing number of rows将 Rdata 文件转换为 CSV - data.frame 参数中的错误意味着行数不同
【发布时间】:2014-06-18 06:53:41
【问题描述】:

我正在尝试使用answer 中的 R 代码将一堆 rdata 文件转换为 CSV。

resave <- function(file){
  e <- new.env(parent = emptyenv())
  load(file, envir = e)
  objs <- ls(envir = e, all.names = TRUE)
  for(obj in objs) {
    .x <- get(obj, envir =e)
    message(sprintf('Saving %s as %s.csv', obj,obj) )
    write.csv(.x, file = paste0(obj, '.csv'))
  }
}

  resave('yourData.RData')

但是在其中一个文件上我收到了这个错误:

Error in data.frame(`2` = list(pos = c(6506L, 6601L, 21801L, 21811L, 21902L,  : 
  arguments imply differing number of rows: 7670, 9729, 114, 2422
Calls: resave ... as.data.frame -> as.data.frame.list -> eval -> eval -> data.frame

我尝试搜索错误消息,但我无法确定它的正面或反面。

该 rdata 文件是否以某种方式不正确地创建?

有没有更好的方法可以将任意 Rdata 文件转换为 CSV? (我事先不知道文件中的对象名称。)

更新:

这就是我在该 rdata 文件中看到的内容。如果有帮助?? (请记住,我无法真正编辑 rdata 文件,因此我试图找出将它们原样转换为 CSV 的东西。)

> load("indiv8-hmmprob.RData")
> ls()
[1] "dataa"
> write.csv(dataa, file="greg.csv")
Error in data.frame(`2` = list(pos = c(6506L, 6601L, 21801L, 21811L, 21902L,  : 
  arguments imply differing number of rows: 7670, 9729, 114, 2422
> names(dataa)
[1] "2" "3" "4" "X"
> str(dataa)
List of 4
 $ 2:'data.frame':  7670 obs. of  23 variables:
  ..$ pos              : int [1:7670] 6506 6601 21801 21811 21902 21931 22487 24071 26674 26713 ...
  ..$ ref              : chr [1:7670] "C" "A" "G" "A" ...
  ..$ cons             : chr [1:7670] "T" "T" "A" "G" ...
  ..$ reads            : chr [1:7670] "ttt" "tttt" "AAAAA" "GGGGG" ...
  ..$ quals            : chr [1:7670] "FBB" "IIIB" "IFIII" "FFIII" ...
  ..$ A                : int [1:7670] 0 0 5 0 0 0 1 0 0 1 ...
  ..$ C                : int [1:7670] 0 0 0 0 0 0 0 0 2 0 ...
  ..$ G                : int [1:7670] 0 0 0 5 11 0 0 0 0 0 ...
  ..$ T                : int [1:7670] 3 4 0 0 0 10 0 2 0 0 ...
  ..$ N                : int [1:7670] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ bad              : chr [1:7670] NA NA NA NA ...
  ..$ par1ref          : chr [1:7670] "C" "A" "G" "A" ...
  ..$ par2ref          : chr [1:7670] "T" "T" "A" "G" ...
  ..$ read             : Factor w/ 8397 levels "1","2","3","4",..: 2 2 3 3 3 3 4 7 9 9 ...
  ..$ count            : int [1:7670] 3 4 5 5 11 10 1 2 2 1 ...
  ..$ read_allele      : chr [1:7670] "T" "T" "A" "G" ...
  ..$ Pr(y| par1/par1 ): num [1:7670] 9.30e-04 5.69e-04 3.47e-04 1.42e-04 1.90e-08 ...
  ..$ Pr(y| par1/par2 ): num [1:7670] 4.58e-02 1.64e-02 2.41e-03 4.09e-03 8.89e-07 ...
  ..$ Pr(y| par2/par2 ): num [1:7670] 1.61e-01 8.40e-02 8.94e-03 2.09e-02 3.29e-06 ...
  ..$ est              : int [1:7670] 3 3 3 3 3 3 3 3 3 3 ...
  ..$ Pr( par1/par1 |y): num [1:7670] 4.67e-25 2.25e-27 1.98e-31 2.93e-32 2.82e-34 ...
  ..$ Pr( par1/par2 |y): num [1:7670] 2.95e-11 2.86e-11 2.49e-14 1.98e-14 1.08e-14 ...
  ..$ Pr( par2/par2 |y): num [1:7670] 1 1 1 1 1 ...
  ..- attr(*, "badpos")= int [1:11386] 21900 21905 22840 24029 27149 27170 28024 42187 46927 46990 ...
 $ 3:'data.frame':  9729 obs. of  23 variables:
  ..$ pos              : int [1:9729] 6001 22537 25304 27228 28817 28842 30540 48903 48938 48943 ...
  ..$ ref              : chr [1:9729] "A" "A" "A" "C" ...
  ..$ cons             : chr [1:9729] "A" "G" "T" "C" ...
  ..$ reads            : chr [1:9729] "," "GGG" "TTTTT" "," ...
  ..$ quals            : chr [1:9729] "F" "BBB" "BFFFF" "B" ...
  ..$ A                : int [1:9729] 1 0 0 0 0 0 0 0 0 0 ...
  ..$ C                : int [1:9729] 0 0 0 1 1 0 0 0 0 1 ...
  ..$ G                : int [1:9729] 0 3 0 0 0 0 0 0 0 0 ...
  ..$ T                : int [1:9729] 0 0 5 0 0 1 1 1 1 0 ...
  ..$ N                : int [1:9729] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ bad              : chr [1:9729] NA NA NA NA ...
  ..$ par1ref          : chr [1:9729] "A" "A" "A" "C" ...
  ..$ par2ref          : chr [1:9729] "G" "G" "T" "T" ...
  ..$ read             : Factor w/ 10640 levels "1","2","3","4",..: 1 3 4 5 7 7 8 10 10 10 ...
  ..$ count            : int [1:9729] 1 3 5 1 1 1 1 1 1 1 ...
  ..$ read_allele      : chr [1:9729] "A" "G" "T" "C" ...
  ..$ Pr(y| par1/par1 ): num [1:9729] 0.969856 0.002707 0.000372 0.969639 0.969856 ...
  ..$ Pr(y| par1/par2 ): num [1:9729] 0.48995 0.0567 0.00228 0.48988 0.48995 ...
  ..$ Pr(y| par2/par2 ): num [1:9729] 0.01005 0.26071 0.00798 0.01012 0.01005 ...
  ..$ est              : int [1:9729] 1 3 3 1 1 1 1 3 1 3 ...
  ..$ Pr( par1/par1 |y): num [1:9729] 2.18e-10 2.82e-11 2.67e-11 2.65e-11 2.63e-11 ...
  ..$ Pr( par1/par2 |y): num [1:9729] 0.688 0.688 0.688 0.688 0.688 ...
  ..$ Pr( par2/par2 |y): num [1:9729] 0.312 0.312 0.312 0.312 0.312 ...
  ..- attr(*, "badpos")= int [1:13707] 25259 27250 27810 27880 27888 28836 30507 48975 55998 58734 ...
 $ 4:'data.frame':  114 obs. of  23 variables:
  ..$ pos              : int [1:114] 21119 21194 42177 64136 64146 74463 74465 74521 79860 79884 ...
  ..$ ref              : chr [1:114] "T" "T" "C" "C" ...
  ..$ cons             : chr [1:114] "C" "A" "Y" "Y" ...
  ..$ reads            : chr [1:114] "cCCCCCCCCCCCCCcc" "aa" "T" "T" ...
  ..$ quals            : chr [1:114] "IBFFBFBFFFFFFBBF" "FF" "F" "I" ...
  ..$ A                : int [1:114] 0 2 0 0 0 0 0 0 2 0 ...
  ..$ C                : int [1:114] 16 0 0 0 1 0 1 1 0 0 ...
  ..$ G                : int [1:114] 0 0 0 0 0 0 0 0 0 2 ...
  ..$ T                : int [1:114] 0 0 1 1 0 1 0 0 0 0 ...
  ..$ N                : int [1:114] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ bad              : chr [1:114] NA NA NA NA ...
  ..$ par1ref          : chr [1:114] "T" "T" "C" "C" ...
  ..$ par2ref          : chr [1:114] "C" "A" "T" "T" ...
  ..$ read             : Factor w/ 130 levels "1","2","3","4",..: 3 3 6 8 8 10 10 10 14 14 ...
  ..$ count            : int [1:114] 16 2 1 1 1 1 1 1 2 2 ...
  ..$ read_allele      : chr [1:114] "C" "A" "T" "T" ...
  ..$ Pr(y| par1/par1 ): num [1:114] 9.34e-12 4.99e-03 1.00e-02 1.00e-02 1.00e-02 ...
  ..$ Pr(y| par1/par2 ): num [1:114] 4.56e-10 2.33e-01 4.90e-01 4.90e-01 4.90e-01 ...
  ..$ Pr(y| par2/par2 ): num [1:114] 9.04e-10 8.61e-01 9.70e-01 9.70e-01 9.70e-01 ...
  ..$ est              : int [1:114] 3 3 3 3 3 3 3 3 3 3 ...
  ..$ Pr( par1/par1 |y): num [1:114] 6.50e-24 4.49e-24 1.10e-26 2.53e-31 1.51e-31 ...
  ..$ Pr( par1/par2 |y): num [1:114] 1.56e-10 1.54e-10 5.77e-11 6.60e-12 6.59e-12 ...
  ..$ Pr( par2/par2 |y): num [1:114] 1 1 1 1 1 ...
  ..- attr(*, "badpos")= int [1:73] 16621 16638 34177 34180 74448 74464 78954 79664 80045 94170 ...
 $ X:'data.frame':  2422 obs. of  23 variables:
  ..$ pos              : int [1:2422] 34630 45427 70728 70744 166279 189892 207276 207424 213012 232229 ...
  ..$ ref              : chr [1:2422] "T" "G" "G" "C" ...
  ..$ cons             : chr [1:2422] "T" "G" "G" "C" ...
  ..$ reads            : chr [1:2422] "a" "..." "^F." "." ...
  ..$ quals            : chr [1:2422] "<" "IIF" "F" "B" ...
  ..$ A                : int [1:2422] 1 0 0 0 0 0 0 4 0 1 ...
  ..$ C                : int [1:2422] 0 0 0 1 1 0 2 0 0 0 ...
  ..$ G                : int [1:2422] 0 3 1 0 0 1 0 1 1 0 ...
  ..$ T                : int [1:2422] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ N                : int [1:2422] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ bad              : chr [1:2422] NA NA NA NA ...
  ..$ par1ref          : chr [1:2422] "T" "G" "G" "C" ...
  ..$ par2ref          : chr [1:2422] "A" "A" "A" "T" ...
  ..$ read             : Factor w/ 2433 levels "1","2","3","4",..: 1 6 8 8 13 16 18 18 19 20 ...
  ..$ count            : int [1:2422] 1 3 1 1 1 1 2 5 1 1 ...
  ..$ read_allele      : chr [1:2422] "A" "G" "G" "C" ...
  ..$ Pr(y| par1/par1 ): num [1:2422] 0.0105 0.2732 0.9699 0.9696 0.9699 ...
  ..$ Pr(y| par1/par2 ): num [1:2422] 0.4895 0.0642 0.49 0.4899 0.49 ...
  ..$ Pr(y| par2/par2 ): num [1:2422] 0.96856 0.00134 0.01005 0.01012 0.01005 ...
  ..$ est              : int [1:2422] 3 1 1 1 1 1 1 1 1 1 ...
  ..$ Pr( par1/par1 |y): num [1:2422] 1 1 1 1 1 ...
  ..$ Pr( par1/par2 |y): num [1:2422] 3.70e-08 2.00e-08 1.06e-08 1.06e-08 1.59e-09 ...
  ..$ Pr( par2/par2 |y): num [1:2422] 3.70e-18 9.35e-20 2.36e-23 2.23e-23 3.26e-26 ...
  ..- attr(*, "badpos")= int [1:2327] 34776 45619 86591 86607 166220 193151 193159 212997 232221 233552 ...

【问题讨论】:

  • 尝试在您的 read/write.csv 中包含 fill = T?这似乎对我有用的行数不同
  • 奇怪,所以我做了write.csv(.x, file = paste(obj, '.csv', sep=""), fill=T),我得到了错误:Error in write.table(.x, file = paste(obj, ".csv", sep = ""), fill = T, : unused argument(s) (fill = T) Calls: resave ... write.csv -&gt; eval.parent -&gt; eval -&gt; eval -&gt; write.table
  • 您的源 .Rdata 文件中是否有一个名为 2 的数据框?我已经使用了很多 resave 功能,没有任何问题。或者您的姓名集合objs 包含您未预料到的内容。我将从搜索该列表开始。
  • 我更新了显示 rdata 文件中内容的问题。有一个叫 2。

标签: r dataframe rdata


【解决方案1】:

我会投票给另一个答案,但这里有一些几乎可以工作的代码:

resave <- function(file){
  e <- new.env(parent = emptyenv())
  load(file, envir = e)
  obj <- get('dataa', envir =e)
  lapply( names(obj), function(nam) {
    write.csv( obj[[nam]], file=paste(nam, ".csv", sep="") )
    cat(sprintf('%s.csv
', nam) )
    }
   )
}
resave("indiv8-hmmprob.RData")

这是输出。这可行,但最后会抛出一些奇怪的打印内容,[[1]] NULL 等。

2.csv
3.csv
4.csv
X.csv
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

【讨论】:

  • “NULLs”来自于 lapply 与两个函数一起使用,write.csvcat,每个函数都返回 NULL,因此每次传递都没有最后一个评估结果,即结果为NULL。
【解决方案2】:

该答案旨在处理类-'data.frame'的对象。您只有一个类-'list' 的对象,其中恰好有数据框项目。因此,您的工作区中没有名称为“2”的对象,但“dataa”列表中有一个名为“2”的元素,并且所有其他元素似乎也是数据框,所以为什么不使用:

lapply( names(dataa), function(nam) write.csv( data[[nam]], file=paste0(nam, ".Rdata") ) )

【讨论】:

  • 这看起来不错;我可能会建议使用 foo&lt;-dataa 来验证列表变量是否正常。
  • 谢谢。问题是我试图找出一些通用的东西,因为我不知道提前在 rdata 文件中会有什么。有没有办法概括这个答案?
  • @Greg,不是真的 - 您必须按 class 对对象列表进行排序,并对列表变量执行 unlist 之类的操作。
  • 更新我想我得到了它与你所有的代码一起工作。但是为什么在文件名之后打印 [[1]] NULL 等? (有关代码和输出,请参阅我的答案)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多