【问题标题】:Reading ASCII into table and select specific rows from the table in R将ASCII读入表并从R中的表中选择特定行
【发布时间】:2017-04-09 07:59:16
【问题描述】:

This is related to the question that I posted earlier.我相信在R中一定有更好的方法可以做到这一点,而无需在R中使用sql。因为sql无法识别R中的变量,所以目前它给了我一些错误。这可能是由于语法错误。 SQL 错误很明显,因为这些列不在 df0 中。不过,需要有一种方法将文件名注入到选定的行中。为什么 R 读取的文件不超过 2 个?

任何人都可以指出根本原因并提出一些想法以获得更好的解决方案吗?

> df <- NULL
> fn <- NULL
> n <- 1
> for (f in files) {
+     fn <- file_path_sans_ext(f)
+     df0 <-read.table(f, sep=",")
+     n <- n + 1
+     df <- sqldf('select n, fn, V1, V2 from df0 
where V1 IN (101, 201, 301, 401)') 
-- thought R could read fn just as df0
+     df <- rbind(df) --further fn and n only reads two files out of 1000s
+ }
Error in rsqlite_send_query(conn@ptr, statement) : 
no such column: n, df1

【问题讨论】:

  • 发布到 SO 的 r 标签的代码必须是最低限度的完整和可重现的,以便其他人只需将其复制到他们的会话中即可运行它。
  • @G.Grothendieck 我不太关注你。如您所见,此标签非常新。它是一个新的约定还是仅适用于 R?你能指出什么是“最小的完整和可重复的”吗?用户/开发者的代码不是特定于他们的目的吗?
  • @G.Grothendieck 这是一个很好的做法,但通常情况并非如此。上面的 sn-p 只有几行。与那里的许多问题和答案相比,它是相当多变的。我的问题必须显示错误和代码,以便查看者识别问题。我只是想知道这不是最小的,为什么它不能被复制......是否会在问题更新后恢复否决票?此外,我要求替代 sql。

标签: r for-loop ascii


【解决方案1】:

sqldf 创建一个临时数据库并将数据帧(不是标量或其他对象)从您的工作区上传到它。如果要合并标量,则可以使用 gsubfn 包(sqldf 包自动加载)中的fn 将它们注入到 SQL 语句中。比如使用内置的BODdata.frame:

library(sqldf)

n <- nrow(BOD)
s <- "abc"

fn$sqldf("select $n as n, '$s' as string, demand from BOD")

给予:

  n string demand
1 6    abc    8.3
2 6    abc   10.3
3 6    abc   19.0
4 6    abc   16.0
5 6    abc   15.6
6 6    abc   19.8

建议您阅读?sqldf?fn 并查看sqldf github home page 上的示例,因为所有这些都有很好的记录。

【讨论】:

  • 如前所述,我不喜欢在 R 中使用 sql。过去我有足够的 sql 份额。另外,对于其他用户(不熟悉 sql 和 db)的好处,偏好仅在 R 上。您能否建议一种替代方法来实现相同的目标而不使用 sql?
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2018-05-20
  • 2022-10-14
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多