سؤال

أحاول قراءة السلسلة الزمنية من ملف CSV وحفظها كـ XTS لتكون قادرة على معالجتها باستخدام QuantMod. المشكلة هي أن القيم الرقمية لا يتم تحليلها.

ملف CSV:

name;amount;datetime
test1;3;2010-09-23 19:00:00.057
test2;9;2010-09-23 19:00:00.073

رمز R:

library(xts)
ColClasses = c("character", "numeric", "character")
Data <- read.zoo("c:\\dat\\test2.csv", index.column = 3, sep = ";", header = TRUE, FUN = as.POSIXct, colClasses = ColClasses)
as.xts(Data)

نتيجة:

                    name    amount
2010-09-23 19:00:00 "test1" "3"   
2010-09-23 19:00:00 "test2" "9"   

راجع عمود المبلغ يحتوي على بيانات الأحرف ولكن من المتوقع أن يكون رقميًا. ما الخطأ في قانون بلدي؟

هل كانت مفيدة؟

المحلول

بنية البيانات الداخلية لكلاهما zoo و xts هو matrix, ، لذلك لا يمكنك مزج أنواع البيانات.


فقط اقرأ في البيانات مع read.table:

Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)

لاحظت أن بياناتك تحتوي على فروع ، لذلك قد تكون مهتمًا بها xts::align.time. سيستغرق هذا الرمز Data وإنشاء كائن واحد مع عمود لكل منهما "name" بالثواني.

NewData <- do.call( merge, lapply( split(Data,Data$name), function(x) {
  align.time( xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1 )
}) )

إذا كنت تريد إنشاء كائنات test1 و test2 في بيئتك العالمية ، يمكنك أن تفعل شيئًا مثل:

lapply( split(Data,Data$name), function(x) {
  assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
})

نصائح أخرى

لا يمكنك مزج بيانات الرقم والأحرف في كائن حديقة الحيوان أو XTS ؛ ومع ذلك ، إذا لم يكن المقصود من عمود الاسم أن يكون بيانات السلاسل الزمنية ، بل يهدف إلى التمييز بين السلاسل الزمنية المتعددة ، وواحد للاختبار 1 ، واحد للاختبار 2 ، إلخ. ثم يمكنك الانقسام على العمود 1 باستخدام الانقسام = 1 للتسبب كما هو موضح في الكود التالي. تأكد من تعيين الأرقام. Secs وإلا فلن ترى ثانية من المخرجات (على الرغم من أنها ستكون هناك في أي حال):

options(digits.secs = 3)
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
x <- as.xts(z)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top