首页 > 解决方案 > 用于数据帧的 R SQLDF PIVOT

问题描述

我有一个名为 data6 的 data.frame,我想在其上执行数据透视。 在此处输入图像描述 我已经尝试过 sqldf 但在彻底检查后我仍然找不到这个错误出现的原因

“结果创建错误(conn@ptr,语句):靠近“(”:语法错误)

sql 语句:“Select * From (Select * From data6) PIVOT(sum([Qty]) FOR [GRNUOM] in ([con2],[con3],[con4],[Con15],[Con2],[Con3] ,[Con4])"

使用 recast/dcast 功能可以完成,但作为一个新用户,我不知道该怎么做。即使我不知道 recast 和 dcast 之间有什么区别。

我知道这是很多问题,但如果有人帮助我解决这个问题

标签: r

解决方案


默认情况下,该sqldf包使用 SQLite 作为底层数据库,因此PIVOT您使用的语法将不起作用。虽然您可能能够将基础数据库更改为 SQL Server,但您也可以只使用 ANSI 标准数据透视查询:

sql <- "SELECT \"Style Name\",
            SUM(CASE WHEN GRNUOM = 'con2' THEN Qty ELSE 0 END) AS con2,
            SUM(CASE WHEN GRNUOM = 'con3' THEN Qty ELSE 0 END) AS con3,
            SUM(CASE WHEN GRNUOM = 'con4' THEN Qty ELSE 0 END) AS con4,
            SUM(CASE WHEN GRNUOM = 'Con15' THEN Qty ELSE 0 END) AS Con15,
            SUM(CASE WHEN GRNUOM = 'Con2' THEN Qty ELSE 0 END) AS Con2,
            SUM(CASE WHEN GRNUOM = 'Con3' THEN Qty ELSE 0 END) AS Con3,
            SUM(CASE WHEN GRNUOM = 'Con4' THEN Qty ELSE 0 END) AS Con4
FROM data6
GROUP BY \"Style Name\""

result <- sqldf(sql)

我不确定是否con2并且Con2实际上会被识别为单独的列名。您可能必须将所有列名放在双引号中,以使上述查询按您期望的方式工作。


推荐阅读