不正确地阅读数据?

时间:2010-09-27 23:01:11

标签: r

我想我不是一开始就问正确的问题。

新问题: 我有一个1.5gig的tsv文件。它顶部有6行垃圾,底部有一行垃圾,我想删除所有这些垃圾而不必打开文件。第7行是标题。我有13个标题。行数未知。

如何将文件读入数据框,以便我可以执行基本的描述性统计,箱形图等....


原始问题:

您好

我觉得这个很容易。我只是遗漏了一些东西。

我有一个txt文件,标签分隔,顶部有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)

Avg.Position是label13和一些形式#。#

然而我收到一个错误: hist.default(avgposition)出错:'x'必须是数字

为什么不将数据视为数字?

谢谢!

根据要求,这里有一些数据:

> 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")

4 个答案:

答案 0 :(得分:2)

如果列中包含除数字和NA之外的其他内容,则会将列视为非数字。你得到的实际列错了,或者列中有一些需要清理的垃圾。

也许是你删除的那一行。如果列中存在除数字之外的其他内容,则该列将转换为数字类型以外的其他内容,这可能是一个因素。如果只是你需要将有问题的变量转换回数字。

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

您可以使用

计算出您需要转换的类型
str(datadump)

答案 1 :(得分:2)

当我不得不从同事们那里拿出凌乱的excel文件时,这种情况发生在我身上。基本上我在数据框中得到空白的“”字符。我通常只是通过将它们重新编码为NA然后再次将其称为as.numeric来修复它。

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 / Cost转换为因子,并且还需要时间/内存。可能有一种方法可以从您的来源执行此操作。 (看起来像是从网络分析软件下载,但我不知道哪个 - 自从我完成网络分析以来已经很长时间了)

答案 2 :(得分:2)

事情显然对你来说非常麻烦,部分原因是你的数据量很大。根据您报告的尺寸,您必须执行以下任一选项:

  • 您重新调整问题,因此您不必加载完整的数据集
  • 您使用R中可用的技术来处理大型数据集。
  • 你购买了一台带有12Gb内存的64位系统,并将你的R内存设置得足够大。

如果您选择后者,您今年可能会看到洛杉矶R用户组中的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)

如果没有实际数据,很难指导您完成整个过程。请记住在其他答案中所说的内容,它都是有效的。

答案 3 :(得分:0)

您使用read.delim2,其中默认小数点分隔符为,,但您的数据小数点分隔符为.。尝试使用read.delim,不要忘记将na.strings参数设为Brandon Bertelsen states

如果它是1.5GB文件,您可以考虑?read.table关于comment.char参数的建议:

  

comment.char:character:一个角色   包含a的长度的向量             单个字符或空字符串。 使用“”“来转             关闭评论的解释

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