关于我需要什么的简短故事:我已经读过CSV文件了,我想把一些列存储到变量中作为自己的数据框,然后存储变量到列表中。但是,当我使用c()
执行此操作时,它只是将所有数据放在平面向量中。有没有办法获得数据框列表?
较长的故事:我在CSV文件中读过,假设它看起来像这样
,"Date","px high","px low","px last",,,,"Date","px high","px low","px last"
"eur curncy",03/Jan/2000,1.03,1.01,1.02,,,"gbp curncy",03/Jan/2000,1.64,1.61,1.64
,1/4/2000,1.03,1.02,1.03,,,,1/4/2000,1.64,1.63,1.64
,1/5/2000,1.04,1.03,1.03,,,,1/5/2000,1.65,1.64,"#N/A N/A"
,1/6/2000,1.04,1.03,1.03,,,,1/7/2000,1.65,1.64,1.65
当我存储读取的CSV文件并打印变量时,它看起来像
Date px.high px.low px.last Date.1 px.high.1 px.low px.last
eur curncy 03/Jan/2000 1.03 1.02 1.03 03/Jan/2000 1.64 1.63 1.64
1/4/2000 1.03 1.02 1.03 1/4/2000 1.64 1.63 1.64
... etc.
我已经削减了这个示例的大量数据以避免混乱,但是这些数据还有更多的行和列。沿着列,它们在这些组中重复,每个组都有一个日期,px高等。沿着行,你或多或少得到与上面显示的最后几行相同的行。
我最终希望进入每组数据,将其分成几个月,计算每列中每个月的平均值,然后丢弃每日信息,然后为每个组制作一个条形图。但是,我有以下问题需要解决:
cur <- read.csv('C:\\file.csv', stringsAsFactors=FALSE)
然后循环遍历列,在正确的位置分配
cur[1,col] <- as.character(as.date(cur[1,col], format='%d/%b/%Y'))
然后我可以通过循环遍历行然后列来格式化其余的日期条目,并且基本上再次执行相同的操作。
算术问题很容易解决,当我做算术时我只是把所有东西都转换成数字。它可能效率低下但似乎运作良好。但是所有这些行的问题都在同一个数据框中,所以如果我扔掉一行,我也会丢弃该行上的所有其他数据 - 有时候这些行的日期不匹配。所以,如果我扔掉一行有#&#34;#N / A N / A&#34;在一个约会的日子里,我将丢弃其他团体的其他日期,这是我不想要的。因此,我能想到的最佳解决方案是将组分成他们自己的数据框,并将它们分开处理。
但如果有人认为这是一个更好的方法,请告诉我。
答案 0 :(得分:2)
要回答有关列表的问题,是的,您可以将数据框存储在列表中:
l <- list(dat1, dat2, dat3, etc.)
如果您有奇NA
个值,(999,-1,-11,#N / A等),您可以使用na.strings
来捕获这些值,并将列保持为数字:< / p>
(dat <- read.csv(header = TRUE, na.strings = c('#N/A N/A'),
stringsAsFactors = FALSE,
text="Date,px high,px low,px last,
03/Jan/2000,1.03,1.01,1.02,
03/Jan/2000,1.64,1.61,1.64,
1/4/2000,1.03,1.02,1.03,
1/4/2000,1.64,1.63,1.64,
1/5/2000,1.04,1.03,1.03,
1/5/2000,1.65,1.64,#N/A N/A,
1/6/2000,1.04,1.03,1.03,
1/7/2000,1.65,1.64,1.65")[1:4])
# Date px.high px.low px.last
# 1 03/Jan/2000 1.03 1.01 1.02
# 2 03/Jan/2000 1.64 1.61 1.64
# 3 1/4/2000 1.03 1.02 1.03
# 4 1/4/2000 1.64 1.63 1.64
# 5 1/5/2000 1.04 1.03 1.03
# 6 1/5/2000 1.65 1.64 NA
# 7 1/6/2000 1.04 1.03 1.03
# 8 1/7/2000 1.65 1.64 1.65
就像你说的那样,日期有混合格式,所以我使用这个粗略函数来检查使用哪种格式并告诉R使用正确的格式:
f_dat <- function(x)
as.Date(x, format = ifelse(is.na(as.numeric(gsub('/','',x))),
'%d/%b/%Y', '%d/%m/%Y'))
## and format the dates:
(dat <- within(dat, {
Date <- f_dat(Date)
}))
# Date px.high px.low px.last
# 1 2000-01-03 1.03 1.01 1.02
# 2 2000-01-03 1.64 1.61 1.64
# 3 2000-04-01 1.03 1.02 1.03
# 4 2000-04-01 1.64 1.63 1.64
# 5 2000-05-01 1.04 1.03 1.03
# 6 2000-05-01 1.65 1.64 NA
# 7 2000-06-01 1.04 1.03 1.03
# 8 2000-07-01 1.65 1.64 1.65
修改
dat <- read.csv(header = TRUE, na.strings = c('#N/A N/A'),
stringsAsFactors = FALSE,
text=",Date,px high,px low,px last,,,,Date,px high,px low,px last
eur curncy,03/Jan/2000,1.03,1.01,1.02,,,gbp curncy,03/Jan/2000,1.64,1.61,1.64
,1/4/2000,1.03,1.02,1.03,,,,1/4/2000,1.64,1.63,1.64
,1/5/2000,1.04,1.03,1.03,,,,1/5/2000,1.65,1.64,#N/A N/A
,1/6/2000,1.04,1.03,1.03,,,,1/7/2000,1.65,1.64,1.65")
# X Date px.high px.low px.last X.1 X.2 X.3 Date.1 px.high.1 px.low.1 px.last.1
# 1 eur curncy 03/Jan/2000 1.03 1.01 1.02 NA NA gbp curncy 03/Jan/2000 1.64 1.61 1.64
# 2 1/4/2000 1.03 1.02 1.03 NA NA 1/4/2000 1.64 1.63 1.64
# 3 1/5/2000 1.04 1.03 1.03 NA NA 1/5/2000 1.65 1.64 NA
# 4 1/6/2000 1.04 1.03 1.03 NA NA 1/7/2000 1.65 1.64 1.65
f_dat <- function(x)
as.Date(x, format = ifelse(is.na(as.numeric(gsub('/','',x))),
'%d/%b/%Y', '%d/%m/%Y'))
(dat <- within(dat, {
Date <- f_dat(Date)
Date.1 <- f_dat(Date.1)
}))
# X Date px.high px.low px.last X.1 X.2 X.3 Date.1 px.high.1 px.low.1 px.last.1
# 1 eur curncy 2000-01-03 1.03 1.01 1.02 NA NA gbp curncy 2000-01-03 1.64 1.61 1.64
# 2 2000-04-01 1.03 1.02 1.03 NA NA 2000-04-01 1.64 1.63 1.64
# 3 2000-05-01 1.04 1.03 1.03 NA NA 2000-05-01 1.65 1.64 NA
# 4 2000-06-01 1.04 1.03 1.03 NA NA 2000-07-01 1.65 1.64 1.65