【问题标题】:Is there a way to tell R that the file I refer to in a connection is a csv2?有没有办法告诉 R 我在连接中引用的文件是 csv2?
【发布时间】:2021-08-09 04:36:07
【问题描述】:

我有一个巨大的文件 (csv2),我使用命令 sqldf() 从中选择 1000 个观察值。具体来说,我使用以下代码:

f<-file("C:/Users/myfile.csv")
df<-sqldf("SELECT DISTINCT Draw 
           FROM f  
           ORDER BY RANDOM(*) 
           LIMIT 1000", 
         file.format = list(header = TRUE, sep=";", dec=","))

df<-sqldf("SELECT * FROM f 
           WHERE Draw IN df",
        file.format = list(header = TRUE, sep=";", dec=","))

问题在于 R 似乎无法识别连接中的文件是 csv2 并且生成的数据框中的数据被分类为文本,因为小数点的逗号未转换为点。你知道有没有办法解决这个问题? 谢谢!

【问题讨论】:

  • 根据 r 标签页面顶部的要求,请提供可重现的示例。特别是,除了您之外没有人可以运行它,因为该问题没有示例文件可供尝试。前几行就足够了。

标签: r file decimal sqldf


【解决方案1】:

如果你直接从文件中读取,那么你应该使用read.csv2.sql 例如:

  write.csv2(iris, "iris.csv", quote = FALSE, row.names = FALSE)
  read.csv2.sql("iris.csv", dec = ',', sep = ';',
                 sql = "select * from file
                        where Species = 'setosa' 
                        limit 10")

请注意,对于csv2,默认分隔符是;,因此无需指定它。但包括它以防万一

【讨论】:

  • dec= 不是受支持的参数,但它会自动将逗号转换为点。
【解决方案2】:

使用 Onyambu 提供的示例,我们可以使用来自 pkg:data.table 的 fread,因为它允许通过 grep 或 grepl 进行系统级过滤。

 filt <- data.table::fread(cmd= paste("grep", "1,4", "iris.csv"), dec=",")
str(filt)
#======================
Classes ‘data.table’ and 'data.frame':  21 obs. of  5 variables:
 $ V1: num  5.1 4.9 5 4.6 4.4 4.8 5.1 5.2 5.5 4.9 ...
 $ V2: num  3.5 3 3.6 3.4 2.9 3 3.5 3.4 4.2 3.6 ...
 $ V3: num  1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 ...
 $ V4: num  0.2 0.2 0.2 0.3 0.2 0.1 0.3 0.2 0.2 0.1 ...
 $ V5: chr  "setosa" "setosa" "setosa" "setosa" ...
 - attr(*, ".internal.selfref")=<externalptr> 

grepl 函数在我的 Linux 机器上不存在,但 grep 的行为与我看到的其他人使用 grepl 的行为相同(在 Windows 上使用 Cygwin)。

【讨论】:

  • 这不是 grep 的 unix 的吗?我的意思是必须有 grep 命令,即当您打开 cmd 并键入 grep 它应该运行。像 awk、perl、sed 等命令??
  • 是的。这是Unix系统程序。许多控制台中介操作的工作示例都使用 sed 或 awk。
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 2023-03-30
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2012-11-30
相关资源
最近更新 更多