tcltk::as.tclObj(X) 中的错误:无法处理模式“列表”的对象

Error in tcltk::as.tclObj(X) : cannot handle object of mode 'list

我对 R studio 和 Sqldf 很陌生。即使我想彻底解释它,我也不知道问题是什么。我正在尝试使用 SQL 代码来计算 zip_code 列中所有不同的邮政编码。我知道我在某处需要 DistinctCount,但我不知道它如何与 Sqldf 一起使用。我也不知道为什么在执行此基本代码时会出现以下错误:

Det_Crime %>% sqldf("select zip_code, from Det_Crime")

tcltk::as.tclObj(X) 中的错误:无法处理模式 'list

的对象

我的数据:

还有办法在 dplyr 上做到这一点吗?

输入

Det_Crime <- tibble(zip_code=c("01001", "01001", "01002"))

使用dplyr::count()

Det_Crime %>% count(zip_code)

输出:

  zip_code     n
  <chr>    <int>
1 01001        2
2 01002        1

langtang的dplyr方法不错。至于你的错误和 SQL 问题:

  • 不要将帧传递给 sqldf,应该只传递查询。在这种情况下,尝试 sqldf(mtcars, "select cyl") 并查看错误。这是因为 sqldf 试图对第一个不是字符串的参数做一些 string-like 的事情。它将根据 SQL 查询本身中的表引用查找特定帧,因此 from Det_Crime 将触发它在调用环境(或更高版本)中查找对象 Det_Crime

    解决方案:不要像您所做的那样在 %>%-管道中使用 sqldf(.)。 (如果需要,它可以 先于 管道。)

  • select zip_code, from Det_Crime无效SQL,逗号错误

    解决方案: sqldf("select zip_code from Det_Crime") 是一个开始。

最终,您可以通过

在SQL中得到您需要的东西
sqldf("select zip_code, count(*) as n from Det_Crime group by zip_code")

sqldf 在这样的管道中使用。我们以内置 BOD 数据框为例。大括号防止它自动将左侧插入到 sqldf 的第一个参数中,SQL 字符串中的 [.] 指的是管道的左侧。

BOD %>% { sqldf("select * from [.]") }
##   Time demand
## 1    1    8.3
## 2    2   10.3
## 3    3   19.0
## 4    4   16.0
## 5    5   15.6
## 6    7   19.8

或者在没有管道的情况下独立使用它。这给出了相同的结果。

sqldf("select * from BOD")

关于如何计算列中不同值的数量,这给出了 built-in mtcars 数据框的 cyl 列中不同值的数量。如果您想要行数,请将 count(...) 替换为 count(*)。

sqldf("select count(distinct cyl) as count from mtcars")
##   count
## 1     3

获取每个柱体的行数:

sqldf("select cyl, count(*) as count
       from mtcars
       group by cyl")
##   cyl count
## 1   4    11
## 2   6     7
## 3   8    14