2014-11-22 54 views
0

關於我需要的短篇故事:我已經讀取了一個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. 日期的第一行與其他行的格式不同。第一行之後的所有行都是相同的格式。我可以通過在數據讀取爲

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

,然後遍歷列很好解決這個問題我自己,在適當的地方分配

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

然後我可以格式化其餘的日期條目通過循環遍歷行然後列,基本上再次做同樣的事情。

  1. CSV文件中的一些條目包含字符串「#N/AN/A」,我發現它會強制R讀取該列中的每個其他條目,作爲字符串,以便我不能再對對象執行算術運算。只要扔掉那些有這些信息的數據行,我很好,但即使這樣做,列仍然是字符串。另外,如果我將這一行從其中一個組中排除,則我將所有其餘數據全部丟棄,這是我不想做的。

算術問題很容易解決,當我做算術時,我只是將一切都轉換爲數字。這可能效率低下,但它似乎運作良好。但是所有這些行的問題都在同一個數據框中,因此如果我扔掉一行,我也會丟棄該行的所有其他數據 - 有時組的日期不匹配。所以如果我在一個日期上扔掉一個有「#N/A N/A」的行,我會把其他日期丟給其他組,我不想要。因此,我能想到的最佳解決方案是將組分成自己的數據框,並將它們分開處理。

  1. 某些數據具有不匹配的日期。如果該日期不是由所有數據共享的,我希望基本上丟棄這些數據組中的任何一個日期。但是,我只想在所有組中的同一日期執行此操作 - 我不能只刪除一行,因爲該行可能與一個組中的一個日期對應,而另一個組中的另一個日期對應。所以看起來分裂團體似乎是要做的事情。

但是如果有人認爲有更好的方法去,讓我知道。

回答

2

要回答你的問題有關名單,是的,你可以存儲數據幀列表:

l <- list(dat1, dat2, dat3, etc.) 

如果你有奇NA值(999,-1,-11,#N/A等),你可以使用na.strings趕上那些並保持你的列作爲數學運算:

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

爲什麼CSV代碼不可用?我主要是從CSV文件中複製和剪切它。此外,你提供的數據不是它應該如何去的。當我打印稱爲'dat'的變量時,我應該得到一個不同的表格。我將編輯原文,以顯示它應該如何。 – Addem 2014-11-22 02:53:19

+0

嗯,我沒有真的嘗試過,但是無論如何,你可以在你的數據上使用它。 @Addem查看編輯 – rawr 2014-11-22 02:59:18

+0

所以在你的代碼中有一些很好的東西,我以前從未見過,肯定有助於格式化問題,所以謝謝。但是,我仍然不確定如何解決我最大的問題,即刪除數據的適當部分。例如,我希望能夠刪除第二組數據的第三行,因爲它有一個NA值。然後我想刪除第一組值的同一日期。然後,我還想刪除第一個組的第四個日期,因爲它包含日期2000-06-01,而其他日期沒有。 – Addem 2014-11-22 03:05:30