R中的Sqldf - 第一列名称错误
Sqldf in R - error with first column names
每当我使用 read.csv.sql
时,我都无法从第一列中 select 并且代码的任何输出都会在第一列的开头放置一个不寻常的字符 (A(tilde)-..)列的名称。
所以假设我在 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)
知道如何防止将这些字符添加到第一列名称吗?
问题可能是您有一个大于 R 可以处理的文件,因此只想将行的子集读入 R 并指定过滤它的条件涉及引用名称为的第一列搞砸了,所以你不能使用它。
这里有两种替代方法。第一个涉及更多代码,但优点是它是 100% R。第二个只有一个语句,也使用 R,但另外使用外部实用程序。
1) skip header 跳过文件头读取文件。这将导致列被标记为 V1
、V2
等,并在条件中使用 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 另一种方法是使用 filter=
参数。这里我们假设我们知道列名的末尾是 ime
但在此之前还有其他我们不知道的字符。这假设 sed
可用并且在您的路径上。如果您在 Windows,请安装 Rtools 以获得 sed
。引用可能需要根据您的 shell 进行更改。
在 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
所以我通过阅读上面的评论弄明白了。
我在 Windows 10 机器上使用 Excel for Office 365。通过将我保存文件的方式从 "CSV UTF-8 (Comma Delimited)" 更改为仅 "CSV (Comma delimited)".
每当我使用 read.csv.sql
时,我都无法从第一列中 select 并且代码的任何输出都会在第一列的开头放置一个不寻常的字符 (A(tilde)-..)列的名称。
所以假设我在 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)
知道如何防止将这些字符添加到第一列名称吗?
问题可能是您有一个大于 R 可以处理的文件,因此只想将行的子集读入 R 并指定过滤它的条件涉及引用名称为的第一列搞砸了,所以你不能使用它。
这里有两种替代方法。第一个涉及更多代码,但优点是它是 100% R。第二个只有一个语句,也使用 R,但另外使用外部实用程序。
1) skip header 跳过文件头读取文件。这将导致列被标记为 V1
、V2
等,并在条件中使用 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 另一种方法是使用 filter=
参数。这里我们假设我们知道列名的末尾是 ime
但在此之前还有其他我们不知道的字符。这假设 sed
可用并且在您的路径上。如果您在 Windows,请安装 Rtools 以获得 sed
。引用可能需要根据您的 shell 进行更改。
在 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
所以我通过阅读上面的评论弄明白了。
我在 Windows 10 机器上使用 Excel for Office 365。通过将我保存文件的方式从 "CSV UTF-8 (Comma Delimited)" 更改为仅 "CSV (Comma delimited)".