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) 

而不必实际数据,很难引导您完成整个过程。请记住其他答案中的内容,这一切都是有效的。