【问题标题】:Sqldf in R - error with first column namesR中的Sqldf - 第一列名称错误
【发布时间】:2019-03-12 21:01:25
【问题描述】:

每当我使用read.csv.sql 时,我都无法从第一列中进行选择,并且代码的任何输出都会在第一列名称的开头放置一个不寻常的字符(A(波浪号)-..)。

假设我在 Excel 中创建了一个看起来像这样的 df.csv 文件

df = data.frame(
  a = 1, 
  b = 2, 
  c = 3, 
  d = 4)

然后,如果我使用 sqldf 查询工作目录中的 csv,我会收到以下错误:

> read.csv.sql("df.csv", sql = "select * from file where a == 1")
Error in result_create(conn@ptr, statement) : no such column: a

如果我查询与第一列不同的列,我会得到一个结果,但输出的异常字符如下所示

df <- read.csv.sql("df.csv", sql = "select * from file where b == 2")
View(df)

知道如何防止这些字符被添加到第一列名称中吗?

【问题讨论】:

  • 如果这是唯一的问题(并且您无法或不愿意解决编码问题,如果是这样的话),那么您始终可以使用 colnames(x) &lt;- letters[seq_len(ncol(x))] 覆盖列名以降低您的水平 -所有列的大小写字母。如果您的人数超过 26 人,则需要容纳 ...
  • 感谢您的回复。阅读链接后,我意识到这是我将文件保存在 excel 中的方式,通过从 CSV UTF-8 更改为仅 CSV,它删除了字符,我可以像往常一样查询第一列。

标签: sql r excel sqldf


【解决方案1】:

问题可能是您有一个大于 R 可以处理的文件,因此只想将行的子集读入 R 并指定过滤它的条件涉及引用名称混乱的第一列所以你不能使用它。

这里有两种替代方法。第一个涉及更多代码,但优点是它是 100% R。第二个只是一个语句,也使用 R,但还使用了外部实用程序的 an。

1) 跳过标题 跳过标题读取文件。这将导致列被标记为V1V2 等,并在条件中使用V1

# write out a test file - BOD is a data frame that comes with R
write.csv(BOD, "BOD.csv", row.names = FALSE, quote = FALSE)

# read file skipping over header
DF <- read.csv.sql("BOD.csv", "select * from file where V1 < 3", 
  skip = 1, header = FALSE)

# read in header, assign it to DF and fix first column
hdr <- read.csv.sql("BOD.csv", "select * from file limit 0")
names(DF) <- names(hdr)
names(DF)[1] <- "TIME"  # suppose we want TIME instead of Time

DF
##   TIME demand
## 1    1    8.3
## 2    2   10.3

2) 过滤器 另一种方法是使用filter= 参数。这里我们假设我们知道列名的结尾是ime,但在此之前还有其他我们不知道的字符。这假定sed 可用并且在您的路径上。如果您在 Windows 上安装 Rtools 以获取 sed。根据您的外壳,可能需要更改引用。

在 Windows 上尝试此操作时,我注意到 Rtools 中的 sed 更改了行尾,因此我们在下面指定了 eol= 以确保正确处理。你可能不需要那个。

DF <- read.csv.sql("BOD.csv", "select * from file where TIME < 3", 
  filter = 'sed -e "1s/.*ime,/TIME,/"' , eol = "\n")
DF
##   TIME demand
## 1    1    8.3
## 2    2   10.3

【讨论】:

  • 感谢您的详细回复。我其实已经想出了如何将角色完全带走,但如果我无法做到,我会使用你的方法。
【解决方案2】:

所以我通过阅读上面的 cmets 弄清楚了。

我在使用 Excel for Office 365 的 Windows 10 计算机上。通过将我保存文件的方式从“CSV UTF-8(逗号分隔)”更改为“CSV(逗号分隔)”,特殊字符将消失”。

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 2019-01-13
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多