如何解决当col可能丢失时R sqldf SELECT
我有许多.csv文件。某些列显示在所有文件中,而另一些仅显示在某些文件中。我也不想有其他许多列。
我正在使用R sqldf遍历.csv文件,选择所需的列,并将其写入新的.csv文件。但是,我不知道如何告诉sqldf在某些.csv文件中可能找不到某些列,在这种情况下,无论如何我都希望它创建它(即使它为空白)。
在下面的示例中,列userlocation1
仅出现在某些.csv文件中。因此,如果文件没有文件,该代码将不起作用。
我尝试了try-catch,但这只是导致某些文件根本没有被处理。
for (fileNumber in fileNumbers){
newfileName <- paste(sub(paste("\\.",sep = ""),"",fileNames[fileNumber]),"-clean",".csv",sep = "")
tx <- paste(readLines(fileNames[fileNumber],encoding="UTF-8"),collapse="%%%")
tx_as_table <- fread(text = tx,header = TRUE,sep = ",",nrows = 501,stringsAsFactors = FALSE,fill = TRUE,select = 1:50)
dfmediaurl <- sqldf('select created_at,text,id_str,in_reply_to_status_id,username1,userscreen_name1,userlocation1 from tx_as_table')
write.table(x = dfmediaurl,file = newfileName,append = FALSE,quote = TRUE,sep
= ";",row.names = FALSE,col.names = TRUE)
}
解决方法
要引用所有列,请使用本示例中的*
和内置anscombe
数据框:
sqldf("select * from anscombe limit 3")
## x1 x2 x3 x4 y1 y2 y3 y4
## 1 10 10 10 8 8.04 9.14 7.46 6.58
## 2 8 8 8 8 6.95 8.14 6.77 5.76
## 3 13 13 13 8 7.58 8.74 12.74 7.71
或仅显示某些列,以使表中可能没有某些列,然后intersect
将列名与表中实际存在的列名创建要使用的列名的字符向量,请将其转换为逗号分隔使用toString
的字符串,并将其插入到SQL语句中。请注意,fn$
必须前缀sqldf
才能启用字符串插值。 verbose=TRUE
还将显示正在运行的SQL语句(即,它还将显示下面以sqldf:
开头的输出行-请注意,输出中的倒数第二sqldf:
行显示了生成的SQL语句):
# use those columns among x3,x4 and x5 that are in anscombe
cols <- toString(intersect(c("x3","x4","x5"),names(anscombe)))
fn$sqldf("select $cols from anscombe limit 3",verbose = TRUE)
## sqldf: library(RSQLite)
## sqldf: m <- dbDriver("SQLite")
## sqldf: connection <- dbConnect(m,dbname = ":memory:")
## sqldf: initExtension(connection)
## sqldf: dbWriteTable(connection,'anscombe',anscombe,row.names = FALSE)
## sqldf: dbGetQuery(connection,'select x3,x4 from anscombe limit 3')
## sqldf: dbDisconnect(connection)
## x3 x4
## 1 10 8
## 2 8 8
## 3 13 8
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。