2013-03-15 7 views
4

Функция R write.csv возвращает ошибку.Функция 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" 

А вот dput() выход VaRStats:

> 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' 

Как это возможно?

+1

отлично работает для меня ... там должно быть недостающую часть, которую вы не предоставляете. –

+0

Здесь прекрасно работает. Может быть, вы можете скопировать/вставить 'dput' на свой объект VaRStats? – juba

+0

Недавно у меня была такая же странная ошибка - она ​​была исправлена ​​просто перезапуском R – alexwhan

ответ

6

Здесь вы можете просто сделать следующее:

 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 

EDIT

Это решение является правильным.

, если у вас есть строка в одном из вас список:

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 потерпит неудачу или, по крайней мере, преобразовать в НС

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: 
+0

приятно (и важно) следить! – Arun

0

Можете ли вы дать воспроизводимый пример, я думаю, что у вас есть проблемы с row.names и col.names, а также использовать write.table, так что вы можете установить все аргументы, которые вы хотите

EDIT: У меня есть один и тот же вид проблемы на 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 вектор

1

Ваши столбцы являются списки. Они должны быть векторами. Попробуй это.

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

поначалу ошибочно используется Lapply здесь, но сменил его на sapply. – ndoogan

+0

(+1) вы можете использовать 'do.call (rbind, lapply (...))' (или cbind, если он дает обратный путь). – Arun

4

По необъяснимой причине ваши столбцы кадра данных являются списками, а не векторами. Вы можете превратить ваш кадр данных обратно в «нормальный» формат с:

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

(+1), но я думаю, что решение agstudy гораздо более прямолинейно. – Arun

+0

@Arun Я согласен с вами. Пожалуйста, поддержите и примите ответ agstudy! – juba