我想我不是一开始就问正确的问题。
新问题: 我有一个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")
答案 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用户组中的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="")
。