为什么 read.csv2 工作正常,但 read.csv2.sql 显示 error/warning?
Why does read.csv2 work just fine, yet read.csv2.sql shows an error/warning?
我正在尝试使用 read.csv2.sql
在 R 中读取一个 csv 文件,因为我想使用来自 SQL 的 SELECT
查询来帮助我过滤数据,但在此之前我什至可以进入我的 SELECT
查询,我发现使用 read.csv2.sql
读取我的 csv 文件已经生成了一条警告消息。
这是我的代码:
investment2 <- read.csv2.sql("investmentdata.csv")
这是警告信息:
Warning message:
In result_fetch(res@ptr, n = n) :
Column 'Capital.Investment': mixed type, first seen values of type real, coercing other values of type string
但是,当我使用正常的read.csv2
功能时,没有报错。特别是,以下代码在没有警告消息的情况下工作正常:
investment <- read.csv2("investmentdata.csv")
接下来,我尝试通过将 Capital.Investment
列转换为真实列来解决此问题,如下所示:
investment3 <- read.csv2.sql("investmentdata.csv", "SELECT *, CAST(Capital.Investment AS real) FROM file")
但是,R 现在会生成以下错误:
Error: no such column: Capital.Investment
因此,我有两个问题。首先,为什么在 read.csv2
工作正常时使用 read.csv2.sql
会生成该警告消息?其次,为什么当我尝试将其投射为真实时,R(或 SQL)无法识别我的 Capital.Investment
专栏?
也许还值得注意的是,我不能简单地忽略 read.csv2.sql
函数显示的这个警告,因为我发现作为这个警告的结果,它自动投射了一些 NA
列中的 Capital.Investment
行更改为 0
,这是我不允许的 - NA
行必须保留为 NA
。不过,我的 csv 文件的其他列似乎没有这个问题。
由于我是 R 的新手,任何帮助和解释将不胜感激:)
编辑
我截断的 csv 文件的编码版本如下所示。特别是,相关列的名称确实是 Capital.Investment
.
id;targetC;year;comp_id;homeC;Industry.Activity;Capital.Investment;Estimated;Jobs.Created;Estimated.1;Project.Type;geographic distance;SIC;listed;sales;assets;cap_structure;rnd;profit;rndintensity;polcon;homeC_gdp;targetC_gdp;homeC_gdppc;targetC_gdppc
1302;AUS;2008;FR338966385;FRA;Design, Development & Testing;33.1;Yes;36;Yes;New;15.26414042;3669;Unlisted;4333088.972;4037211.732;0;NA;-1339221.733;NA;0.489032525;2.92347E+12;1.05456E+12;45413.06571;49628.11513
1311;AUS;2008;US*190521496652;USA;Research & Development;8.4;Yes;30;No;New;15.24712914;NA;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
1313;AUS;2008;GB05817296;GBR;Business Services;9.7;Yes;10;Yes;New;15.31094496;7389;Unlisted;NA;87.64187374;NA;NA;NA;NA;0.489032525;2.87546E+12;1.05456E+12;46523.26545;49628.11513
1318;AUS;2008;US129687150L;USA;Business Services;1.3;Yes;225;Yes;New;15.24712914;7373;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
1351;AUS;2008;GB*P0060071;GBR;Electricity;516;No;51;Yes;New;15.31094496;NA;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;2.87546E+12;1.05456E+12;46523.26545;49628.11513
9925;AUS;2008;GB00034121;GBR;Business Services;34.8;Yes;37;Yes;New;15.31094496;4412;Unlisted;NA;2079288.611;0.355157008;NA;94320.15469;NA;0.489032525;2.87546E+12;1.05456E+12;46523.26545;49628.11513
9932;AUS;2008;CA30060NC;CAN;Sales, Marketing & Support;3.2;Yes;11;Yes;New;14.88812529;1094;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.54913E+12;1.05456E+12;46596.33599;49628.11513
9935;AUS;2008;US940890210;USA;Manufacturing;771;Yes;266;Yes;New;15.24712914;2911;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9938;AUS;2008;US770059951;USA;Technical Support Centre;9.1;Yes;104;Yes;Co-Locati;15.24712914;3661;Listed;34922000;53340000;0.120134983;4598000;7333000;0.086201723;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9946;AUS;2008;US010562944;USA;Extraction;535.8;Yes;198;Yes;New;15.24712914;2911;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9955;AUS;2008;DE5030147191;DEU;Logistics, Distribution & Transportation;21.2;Yes;134;Yes;New;14.6718338;4311;Listed;93495971.01;346629334.8;0.036629492;0;2044745.934;0;0.489032525;3.75237E+12;1.05456E+12;45699.19832;49628.11513
9958;AUS;2008;US126012192L;USA;Business Services;9.7;Yes;10;Yes;New;15.24712914;8111;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9969;AUS;2008;US135409005;USA;Extraction;NA;No;538;Yes;New;15.24712914;2911;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9977;AUS;2008;JP000000728JPN;JPN;ICT & Internet Infrastructure;128.6;Yes;77;Yes;New;7.0333688;3571;Listed;53255396.85;38181450.16;0.190244908;2584585.523;480589.4308;0.067692176;0.489032525;5.03791E+12;1.05456E+12;39339.29757;49628.11513
9984;AUS;2008;US841547578;USA;Sales, Marketing & Support;13.6;Yes;23;Yes;New;15.24712914;2095;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9993;AUS;2008;US258715604L;USA;Customer Contact Centre;1.8;No;40;No;New;15.24712914;NA;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
此问题已在 chat 中解决,是以下两个问题之一:
- 请参阅下面我的原始答案,这导致
Error
;修复后,我们看到 ...
- 有一个警告,通知一个列(碰巧是同一列)看起来
numeric
但在某处有一个非数字单元格文件的内容。
第一个已在下面解决,第二个只是一个警告。
但是,因为OP要求通过SQL转换为数字,所以NA
被转换为0
,即不好。我的建议是 cast([Capital.Investment] as char) as [Capital.Investment]
并使用 R 的 as.numeric
转换为数字(保留 NA
- 性质),或者直接 read.csv2(.)
文件并使用 sqldf(.)
使用其 SQL 查询 table 类数据。
前面:在您的列名称周围添加方括号或引号。
基本原理:Capital.Investment
被视为点分隔的 table-列或模式-table 或类似的东西不是您想要的打算。我总体上相信 SQL 带有嵌入点的字段名称需要这种转义。如果您的数据嵌入了 space,请注意 R 不喜欢其字段名称中的 space,因此默认情况下在读取数据时使用 make.names
(替换 spaces 带点)。
设置:
将以下内容另存为"quux.csv"
。 (我将其命名为 csv
,但由于我将其更改为 ;
分隔,因此它的行为相同。)
quux;Capital.Investment
1;100
2;200
(或者用Capital Investment
也是一样的。)
sqldf::read.csv2.sql("quux.csv", sql='select quux, cast(Capital.Investment as real) from file')
# Error: no such column: Capital.Investment
sqldf::read.csv2.sql("quux.csv", sql='select quux, cast([Capital.Investment] as real) as CI from file')
# quux CI
# 1 1 100
# 2 2 200
sqldf::read.csv2.sql("quux.csv", sql='select quux, cast("Capital.Investment" as real) as CI from file')
# quux CI
# 1 1 100
# 2 2 200
我正在尝试使用 read.csv2.sql
在 R 中读取一个 csv 文件,因为我想使用来自 SQL 的 SELECT
查询来帮助我过滤数据,但在此之前我什至可以进入我的 SELECT
查询,我发现使用 read.csv2.sql
读取我的 csv 文件已经生成了一条警告消息。
这是我的代码:
investment2 <- read.csv2.sql("investmentdata.csv")
这是警告信息:
Warning message:
In result_fetch(res@ptr, n = n) :
Column 'Capital.Investment': mixed type, first seen values of type real, coercing other values of type string
但是,当我使用正常的read.csv2
功能时,没有报错。特别是,以下代码在没有警告消息的情况下工作正常:
investment <- read.csv2("investmentdata.csv")
接下来,我尝试通过将 Capital.Investment
列转换为真实列来解决此问题,如下所示:
investment3 <- read.csv2.sql("investmentdata.csv", "SELECT *, CAST(Capital.Investment AS real) FROM file")
但是,R 现在会生成以下错误:
Error: no such column: Capital.Investment
因此,我有两个问题。首先,为什么在 read.csv2
工作正常时使用 read.csv2.sql
会生成该警告消息?其次,为什么当我尝试将其投射为真实时,R(或 SQL)无法识别我的 Capital.Investment
专栏?
也许还值得注意的是,我不能简单地忽略 read.csv2.sql
函数显示的这个警告,因为我发现作为这个警告的结果,它自动投射了一些 NA
列中的 Capital.Investment
行更改为 0
,这是我不允许的 - NA
行必须保留为 NA
。不过,我的 csv 文件的其他列似乎没有这个问题。
由于我是 R 的新手,任何帮助和解释将不胜感激:)
编辑
我截断的 csv 文件的编码版本如下所示。特别是,相关列的名称确实是 Capital.Investment
.
id;targetC;year;comp_id;homeC;Industry.Activity;Capital.Investment;Estimated;Jobs.Created;Estimated.1;Project.Type;geographic distance;SIC;listed;sales;assets;cap_structure;rnd;profit;rndintensity;polcon;homeC_gdp;targetC_gdp;homeC_gdppc;targetC_gdppc
1302;AUS;2008;FR338966385;FRA;Design, Development & Testing;33.1;Yes;36;Yes;New;15.26414042;3669;Unlisted;4333088.972;4037211.732;0;NA;-1339221.733;NA;0.489032525;2.92347E+12;1.05456E+12;45413.06571;49628.11513
1311;AUS;2008;US*190521496652;USA;Research & Development;8.4;Yes;30;No;New;15.24712914;NA;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
1313;AUS;2008;GB05817296;GBR;Business Services;9.7;Yes;10;Yes;New;15.31094496;7389;Unlisted;NA;87.64187374;NA;NA;NA;NA;0.489032525;2.87546E+12;1.05456E+12;46523.26545;49628.11513
1318;AUS;2008;US129687150L;USA;Business Services;1.3;Yes;225;Yes;New;15.24712914;7373;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
1351;AUS;2008;GB*P0060071;GBR;Electricity;516;No;51;Yes;New;15.31094496;NA;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;2.87546E+12;1.05456E+12;46523.26545;49628.11513
9925;AUS;2008;GB00034121;GBR;Business Services;34.8;Yes;37;Yes;New;15.31094496;4412;Unlisted;NA;2079288.611;0.355157008;NA;94320.15469;NA;0.489032525;2.87546E+12;1.05456E+12;46523.26545;49628.11513
9932;AUS;2008;CA30060NC;CAN;Sales, Marketing & Support;3.2;Yes;11;Yes;New;14.88812529;1094;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.54913E+12;1.05456E+12;46596.33599;49628.11513
9935;AUS;2008;US940890210;USA;Manufacturing;771;Yes;266;Yes;New;15.24712914;2911;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9938;AUS;2008;US770059951;USA;Technical Support Centre;9.1;Yes;104;Yes;Co-Locati;15.24712914;3661;Listed;34922000;53340000;0.120134983;4598000;7333000;0.086201723;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9946;AUS;2008;US010562944;USA;Extraction;535.8;Yes;198;Yes;New;15.24712914;2911;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9955;AUS;2008;DE5030147191;DEU;Logistics, Distribution & Transportation;21.2;Yes;134;Yes;New;14.6718338;4311;Listed;93495971.01;346629334.8;0.036629492;0;2044745.934;0;0.489032525;3.75237E+12;1.05456E+12;45699.19832;49628.11513
9958;AUS;2008;US126012192L;USA;Business Services;9.7;Yes;10;Yes;New;15.24712914;8111;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9969;AUS;2008;US135409005;USA;Extraction;NA;No;538;Yes;New;15.24712914;2911;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9977;AUS;2008;JP000000728JPN;JPN;ICT & Internet Infrastructure;128.6;Yes;77;Yes;New;7.0333688;3571;Listed;53255396.85;38181450.16;0.190244908;2584585.523;480589.4308;0.067692176;0.489032525;5.03791E+12;1.05456E+12;39339.29757;49628.11513
9984;AUS;2008;US841547578;USA;Sales, Marketing & Support;13.6;Yes;23;Yes;New;15.24712914;2095;Listed;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
9993;AUS;2008;US258715604L;USA;Customer Contact Centre;1.8;No;40;No;New;15.24712914;NA;Unlisted;NA;NA;NA;NA;NA;NA;0.489032525;1.47E+13;1.05456E+12;48401.42734;49628.11513
此问题已在 chat 中解决,是以下两个问题之一:
- 请参阅下面我的原始答案,这导致
Error
;修复后,我们看到 ... - 有一个警告,通知一个列(碰巧是同一列)看起来
numeric
但在某处有一个非数字单元格文件的内容。
第一个已在下面解决,第二个只是一个警告。
但是,因为OP要求通过SQL转换为数字,所以NA
被转换为0
,即不好。我的建议是 cast([Capital.Investment] as char) as [Capital.Investment]
并使用 R 的 as.numeric
转换为数字(保留 NA
- 性质),或者直接 read.csv2(.)
文件并使用 sqldf(.)
使用其 SQL 查询 table 类数据。
前面:在您的列名称周围添加方括号或引号。
基本原理:Capital.Investment
被视为点分隔的 table-列或模式-table 或类似的东西不是您想要的打算。我总体上相信 SQL 带有嵌入点的字段名称需要这种转义。如果您的数据嵌入了 space,请注意 R 不喜欢其字段名称中的 space,因此默认情况下在读取数据时使用 make.names
(替换 spaces 带点)。
设置:
将以下内容另存为"quux.csv"
。 (我将其命名为 csv
,但由于我将其更改为 ;
分隔,因此它的行为相同。)
quux;Capital.Investment
1;100
2;200
(或者用Capital Investment
也是一样的。)
sqldf::read.csv2.sql("quux.csv", sql='select quux, cast(Capital.Investment as real) from file')
# Error: no such column: Capital.Investment
sqldf::read.csv2.sql("quux.csv", sql='select quux, cast([Capital.Investment] as real) as CI from file')
# quux CI
# 1 1 100
# 2 2 200
sqldf::read.csv2.sql("quux.csv", sql='select quux, cast("Capital.Investment" as real) as CI from file')
# quux CI
# 1 1 100
# 2 2 200