2010-09-27 83 views
2

我想我並沒有提出正確的問題。沒有正確讀取數據?

新問題: 我有一個1.5gig tsv文件。它在頂部有6行垃圾,底部有一行垃圾,所有這些我都想在不打開文件的情況下移除。第7行是標題。我有13個標題。行數未知。

怎樣文件讀入到一個數據幀,這樣我可以做基本的描述性統計,箱線圖,等....


原題:

我有這種感覺真的很容易。我只是想念一些東西。

我有一個txt文件,tab分開,頂部有6行垃圾,底部也有垃圾行。 在垃圾我有形式 的Label1 Label2的LABEL3 Label4的數據之間.... Label13 文本ID號百分之....號

這裏是我的R中輸入:

datadump <- read.delim2("truncate.txt", header=TRUE, skip="6") 

cleandata <- datadump[c(-dim(datadump)[1]),] 

avgposition <- cleandata$Avg.Position 

hist(avgposition) 

魅力.POSITION是label13和一些形式的##

然而,我得到一個錯誤: 錯誤hist.default(avgposition):「X」必須是數字

爲什麼沒有看到DAT一個數字?

謝謝!

由於這裏要求的一些數據:

> dput(cleandata) 
structure(list(Account = structure(c(2L, 2L), .Label = c("Crap1", 
"XXS"), class = "factor"), Campaign = structure(c(1L, 1L), .Label = c("3098012", 
"Crap2"), class = "factor"), Customer.Id = structure(c(2L, 2L 
), .Label = c("", "nontech broad (7)"), class = "factor"), Ad.Group = structure(c(2L, 
2L), .Label = c("", "RR 236 (300)"), class = "factor"), Keyword = structure(2:3, .Label = c("", 
"chagall pro", "matisse"), class = "factor"), Keyword.Matching = structure(c(2L, 
2L), .Label = c("", "Broad"), class = "factor"), Impressions = c(4L, 
16L), Clicks = c(1L, 1L), CTR = structure(2:3, .Label = c("", 
"25.00%", "6.25%"), class = "factor"), Avg.CPC = structure(2:3, .Label = c("", 
"$0.05 ", "$0.11 "), class = "factor"), Avg.CPM = structure(2:3, .Label = c("", 
"$12.50 ", "$6.88 "), class = "factor"), Cost = structure(2:3, .Label = c("", 
"$0.05 ", "$0.11 "), class = "factor"), Avg.Position = structure(2:3, .Label = c("", 
"3", "3.1"), class = "factor")), .Names = c("Account", "Campaign", 
"Customer.Id", "Ad.Group", "Keyword", "Keyword.Matching", "Impressions", 
"Clicks", "CTR", "Avg.CPC", "Avg.CPM", "Cost", "Avg.Position" 
), row.names = 1:2, class = "data.frame") 
+0

是否有機會發布文本文件幾行內容的確切內容? – 2010-09-27 23:05:25

+0

修改數據以保持匿名,但本質上我有1演出它的形式: – datayoda 2010-09-27 23:12:14

+0

嘗試使用頭(x,5),然後複製並粘貼一個dput(x)它使人們更容易看你的例子。 – 2010-09-27 23:22:37

回答

2

這發生在我身上了很多,當我不得不拉離我的同事們凌亂的Excel文件轉換。基本上我在數據框中得到空白的「」字符。我通常只是通過將它們重新編碼爲NA來修復它,然後再次將它們作爲數字。

df[df==""] <- NA ## Recodes all "" as NA 
df$Avg.Position <- as.numeric(df$Avg.Position) 
df$some.other.var <- as.numeric(df$some.other.var) 

如果您在Avg.Position中有其他字符串,您也需要搜索並銷燬它們。不要使用as.numeric()來替換,直到你確定所有的奇怪消失。如果不這樣,你的數據可能會發生奇怪的事情。

另外,您可以在開始做的權利:

datadump <- read.delim2("truncate.txt", na.strings=c("NA",""), header=TRUE, skip="6",) 

na.strings=c("NA","")函數read.table告訴說:「NA」和「」是== NA,你可以用它來轉換其他「垃圾」來NA以及。

如果您知道文件最後有多少行與垃圾行相同,也可以使用nrows = SOME_NUMBER。

您可能也希望擺脫$符號,因爲它們會導致您的Avg.CPC/CPM /費用轉換爲因子,並且也需要時間/內存。有可能有一種方法可以從你的來源做到這一點。 (貌似從網絡分析軟件下載,但我不能告訴 - 這是一個很長的時間,因爲我已經做了web分析)

+0

this help!thx。 – datayoda 2010-09-28 19:58:00

2

它看到一個列不是數字,如果它包含了比數字和NA以外的東西。您要麼獲得實際列錯誤,要麼需要清理列中的某些垃圾。

也許這是你刪除的那一行。如果列中除了數字之外還有其他內容,則該列將轉換爲數字類型以外的內容,這可能是一個因素。如果是這樣,你只需要將有問題的變量轉換回數字。

cleandata$Avg.Position <- as.numeric(levels(cleandata$Avg.Position)[cleandata$Avg.Position]) 

你可以制定得什麼類型,你必須從

str(datadump) 
+0

看起來數據確實有些「」。它只是不夠乾淨。 – datayoda 2010-09-27 23:51:50

+0

我試圖加載實際的數據,它給了我噸錯誤:錯誤:不能分配向量的大小128.0 Mb 此外:警告消息: 1:在掃描(文件,什麼,nmax,sep,dec,引用, skip,nlines,na.strings,: 已達到1535Mb的總分配量:請參閱幫助(memory.size) 2:在掃描中(文件,什麼,nmax,sep,dec,quote,skip,nlines,na.strings,: 達到1535Mb的總分配:請參閱幫助(memory.size) 3:在掃描(文件,什麼,nmax,sep,dec,quote,skip,nlines,na.strings,: 達到1535Mb的總分配:請參閱幫助(memory.size) – datayoda 2010-09-28 00:13:08

0

您使用read.delim2其中默認小數點分隔符爲,,但在你的數據小數點分隔符是.。嘗試使用read.delim,不要忘記提供na.strings參數Brandon Bertelsen states

,如果它1.5GB的文件,你可以在?read.tablecomment.char參數考慮的建議:

comment.char: character: a character vector of length one containing a single character or an empty string. Use `""’ to turn off the interpretation of comments

所以使用read.delim(some_others_settings, comment.char="")

+0

read.delim2(file,header = TRUE,sep =「\ t」,quote =「\」「,dec =」,「,fill = TRUE,comment.char = 「」,...)。默認sep =「\ t」。他是usi正確的一個。 read.csv()是sep =「,」 – 2010-09-28 06:16:08

+0

@Brandon我沒有考慮'sep',但是小數點分隔符「dec」。 – Marek 2010-09-28 07:23:12

2

事情顯然對你來說很麻煩,部分原因是你的數據量很大。隨着你報出大小,你真的要做這些選項:

  • 你要改變你的問題,所以你不必裝載全部數據集
  • 您使用現有的技術,R代表巨大的數據集。
  • 你購買一個帶有12Gb RAM的64位系統,並將你的R內存設置得足夠大。

如果您選擇後者,您可能會從今年洛杉磯R Users組中看到presentation of Rosario。有關示例代碼等,另請參閱母版頁here

這就是說,對於非常混亂的數據我使用一點點不同的解決方案,即readLines()textConnection()的組合。首先,我將數據文件作爲行的向量。這使我能夠掃描所有行的尷尬事情,通常使用正則表達式。我也可以很容易地選擇任何一組行來閱讀。 textConnection()然後允許我使用內read.table()read.delim(),...如線是矢量:

Lines <- readLines(somefile.txt) 
Lines <- Lines[seq(2,100,by=2)] # selects every second line 

xx <- textConnection(Lines) 
Data <- read.table(xx,header=T) 
close(xx) 

而不必實際數據,很難引導您完成整個過程。請記住其他答案中的內容,這一切都是有效的。