【问题标题】:Not reading the data the right way?没有以正确的方式读取数据?
【发布时间】:2010-09-27 23:01:11
【问题描述】:

我认为我一开始就没有问正确的问题。

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

如何将文件读入数据框,以便进行基本的描述性统计、箱线图等......


原问题:

我觉得这个真的很容易。我只是错过了一些东西。

我有一个 txt 文件,用制表符分隔,顶部有 6 行垃圾,底部也有 6 行垃圾。 在垃圾之间,我有表格数据 标签1 标签2 标签3 标签4....标签13 文本 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")

【问题讨论】:

  • 能否发布几行文本文件的确切内容?
  • 修改了数据以保持匿名,但本质上我有 1 gig 的形式:
  • 尝试使用 head(x, 5) 然后复制并粘贴一个 dput(x) 它使人们更容易查看您的示例。

标签: r


【解决方案1】:

当我不得不从同事那里提取凌乱的 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,您也可以使用它来将其他 "junk" 转换为 NA。

您也可以使用 nrows=SOME_NUMBER,如果您知道在包含垃圾行的文件末尾之前有多少行。

您可能还想去掉 $ 符号,因为它们会导致您的 Avg.CPC/CPM/Cost 转换为因子,这也需要时间/内存。从您的来源可能有一种方法可以做到这一点。 (看起来像是从网络分析软件下载的,但我不知道是哪个 - 很久没做网络分析了)

【讨论】:

    【解决方案2】:

    如果列包含除数字和 NA 以外的内容,它会将其视为非数字列。您要么弄错了实际的色谱柱,要么色谱柱中有一些垃圾需要清理。

    也许它在你删除的那一行。如果列中存在数字以外的内容,则该列将转换为数字类型以外的内容,这可能是一个因素。如果是,您只需将相关变量转换回数字即可。

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

    你可以用

    计算出你必须转换的类型
    str(datadump)
    

    【讨论】:

    • 看起来数据确实有一些“”。就是不够干净。
    • 我尝试加载实际数据,但它给了我很多错误:错误:无法分配大小为 128.0 Mb 的向量另外:警告消息:1:在扫描中(文件,什么,nmax,sep , dec, quote, skip, nlines, na.strings, : 达到 1535Mb 的总分配: 见帮助(memory.size) 2: 在扫描中(file, what, nmax, sep, dec, quote, skip, nlines, na.字符串,:达到 1535Mb 的总分配:请参阅帮助(memory.size) 3:在扫描(文件,什么,nmax,sep,dec,引用,跳过,nlines,na.strings,:达到 1535Mb 的总分配:请参阅帮助(内存.大小)
    【解决方案3】:

    事情显然对您来说非常混乱,部分原因是您的数据量很大。对于您报告的大小,您确实必须执行以下任一选项:

    • 你重新调整你的问题,这样你就不必加载完整的数据集
    • 您将 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)
    

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

    【讨论】:

      【解决方案4】:

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

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

      comment.char: 字符:一个字符 长度为 1 的向量包含 a 单个字符或空字符串。 使用`""'转 关闭cmets的解释

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

      【讨论】:

      • read.delim2(file, header = TRUE, sep = "\t", quote="\"", dec=",", fill = TRUE, comment.char="", . ..) . 默认 sep = "\t"。他使用的是正确的。read.csv() 是 sep=","
      • @Brandon 我不接受 sep 而是小数分隔符 - dec
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多