如何制作数据框的“列表”或“向量”

时间:2014-11-22 01:48:00

标签: r csv dataframe

关于我需要什么的简短故事:我已经读过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高等。沿着行,你或多或少得到与上面显示的最后几行相同的行。

我最终希望进入每组数据,将其分成几个月,计算每列中每个月的平均值,然后丢弃每日信息,然后为每个组制作一个条形图。但是,我有以下问题需要解决:

  1. 第一行日期格式与其他行格式不同。第一行之后的所有行都采用相同的格式。通过阅读数据
  2. ,我可以很好地解决这个问题

    cur <- read.csv('C:\\file.csv', stringsAsFactors=FALSE)

    然后循环遍历列,在正确的位置分配

    cur[1,col] <- as.character(as.date(cur[1,col], format='%d/%b/%Y'))

    然后我可以通过循环遍历行然后列来格式化其余的日期条目,并且基本上再次执行相同的操作。

    1. CSV文件中的某些条目包含字符串&#34; #N / A N / A&#34;我发现它将迫使R将该列中的每个其他条目作为字符串读取,这样我就不能再对该对象执行算术运算了。我很好地抛弃那些有这些数据的行,但即使这样做,列仍然是字符串。此外,如果我将这一行从其中一个组中抛出,我会丢弃所有剩余数据的整行,这是我不想做的。
    2. 算术问题很容易解决,当我做算术时我只是把所有东西都转换成数字。它可能效率低下但似乎运作良好。但是所有这些行的问题都在同一个数据框中,所以如果我扔掉一行,我也会丢弃该行上的所有其他数据 - 有时候这些行的日期不匹配。所以,如果我扔掉一行有#&#34;#N / A N / A&#34;在一个约会的日子里,我将丢弃其他团体的其他日期,这是我不想要的。因此,我能想到的最佳解决方案是将组分成他们自己的数据框,并将它们分开处理。

      1. 部分数据的日期不匹配。如果所有数据都不共享该日期,我想基本上丢弃这些数据组中的任何一个日期。但同样我只想在所有组中的同一日期执行此操作 - 我不能只删除一行,因为该行可能对应于一个组中的一个日期而另一个组中的另一个日期。所以再次看起来像分裂群体是要做的事情。
      2. 但如果有人认为这是一个更好的方法,请告诉我。

1 个答案:

答案 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