在R Sweave PDF中打印出SQL表

时间:2015-07-07 20:22:14

标签: sql sql-server r sql-server-2008 sweave

这看起来应该很简单,但我似乎无法在任何地方找到答案。

这看起来像使用聪明的SQL查询一样容易解决,因为它使用R代码。

使用以下代码将表格拉入脚本:

dbhandle <- SQLConn_remote(DBName = "DATABASE", ServerName = "SERVER")
Testdf<-sqlQuery(dbhandle, 'select * from TABLENAME
                order by FileName, Number, Category', stringsAsFactors = FALSE)

我想在R Sweave PDF上打印出一个SQL表。我想在以下条件下这样做:

  • 仅打印特定列。使用sqlQuery这似乎很简单,但我已经在我的脚本中创建了一个名为Testdf的变量,其中包含了所有表格,所以如果可以的话,我宁愿只将其子集化。我不满足于这样做的原因是因为下一个条件在查询中似乎超出了我的范围。

  • 这是棘手的部分。在下面给出的示例表中,有一个按版本号和组Number组织的文件名列表。我想在.Rnw文件中打印表,以便有3列。第1列是FileName列,第2列是所有值的列,其中Number == 2,最后(第3)列是所有值的列,其中Number == 3.

这是表格的样子:

|  Name | Version | Category | Value |  Date  | Number |   Build   | Error |
|:-----:|:-------:|:--------:|:-----:|:------:|:------:|:---------:|:-----:|
| File1 | 0.01    | Time     | 123   | 1-1-12 | 1      | Iteration | None  |
| File1 | 0.01    | Size     | 456   | 1-1-12 | 1      | Iteration | None  |
| File1 | 0.01    | Final    | 789   | 1-1-12 | 1      | Iteration | None  |
| File2 | 0.01    | Time     | 312   | 1-1-12 | 1      | Iteration | None  |
| File2 | 0.01    | Size     | 645   | 1-1-12 | 1      | Iteration | None  |
| File2 | 0.01    | Final    | 978   | 1-1-12 | 1      | Iteration | None  |
| File3 | 0.01    | Time     | 741   | 1-1-12 | 1      | Iteration | None  |
| File3 | 0.01    | Size     | 852   | 1-1-12 | 1      | Iteration | None  |
| File3 | 0.01    | Final    | 963   | 1-1-12 | 1      | Iteration | None  |
| File1 | 0.02    | Time     | 369   | 1-1-12 | 2      | Iteration | None  |
| File1 | 0.02    | Size     | 258   | 1-1-12 | 2      | Iteration | None  |
| File1 | 0.02    | Final    | 147   | 1-1-12 | 2      | Iteration | None  |
| File2 | 0.02    | Time     | 753   | 1-1-12 | 2      | Iteration | None  |
| File2 | 0.02    | Size     | 498   | 1-1-12 | 2      | Iteration | None  |
| File2 | 0.02    | Final    | 951   | 1-1-12 | 2      | Iteration | None  |
| File3 | 0.02    | Time     | 753   | 1-1-12 | 2      | Iteration | None  |
| File3 | 0.02    | Size     | 915   | 1-1-12 | 2      | Iteration | None  |
| File3 | 0.02    | Final    | 438   | 1-1-12 | 2      | Iteration | None  |

这就是我想要的样子:

|  Name | 0.01 | 0.02 |
|:-----:|:----:|:----:|
| File1 | 123  | 369  |
| File1 | 456  | 258  |
| File1 | 789  | 147  |
| File2 | 312  | 753  |
| File2 | 645  | 498  |
| File2 | 978  | 951  |
| File3 | 741  | 753  |
| File3 | 852  | 915  |
| File3 | 963  | 438  |

中间和右侧列标题来自原始Version列。中间列中的值是Value列中与0.01列中的Version1列中的Number对应的所有条目。右列中的值是Value列中与0.02列中的Version2列中的Number对应的所有条目

以下是一个示例数据库供参考,如果您想使用R来重现这一点:

rw1 <- c("File1", "File1", "File1", "File2", "File2", "File2", "File3", "File3", "File3", "File1", "File1", "File1", "File2", "File2", "File2", "File3", "File3", "File3", "File1", "File1", "File1", "File2", "File2", "File2", "File3", "File3", "File3")
rw2 <- c("0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.02", "0.02", "0.02", "0.02", "0.02", "0.02", "0.02", "0.02", "0.02", "0.03", "0.03", "0.03", "0.03", "0.03", "0.03", "0.03", "0.03", "0.03")
rw3 <- c("Time", "Size", "Final", "Time", "Size", "Final", "Time", "Size", "Final", "Time", "Size", "Final", "Time", "Size", "Final", "Time", "Size", "Final", "Time", "Size", "Final", "Time", "Size", "Final", "Time", "Size", "Final")
rw4 <- c(123, 456, 789, 312, 645, 978, 741, 852, 963, 369, 258, 147, 753, 498, 951, 753, 915, 438, 978, 741, 852, 963, 369, 258, 147, 753, 498)
rw5 <- c("01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12", "01/01/12")
rw6 <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3)
rw7 <- c("Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Iteration", "Release", "Release", "Release", "Release", "Release", "Release", "Release", "Release", "Release")
rw8 <- c("None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "None", "Cannot Connect to Database", "None", "None", "None", "None", "None", "None", "None", "None")


Testdf = data.frame(rw1, rw2, rw3, rw4, rw5, rw6, rw7, rw8)
colnames(Testdf) <- c("FileName", "Version", "Category", "Value", "Date", "Number", "Build", "Error") 

1 个答案:

答案 0 :(得分:0)

以下是使用dplyrtidyr的解决方案。选择相关变量。然后添加索引列以允许数据为spread,而不会出现重复索引的问题。然后使用spread重新整形数据,最后删除索引列。

library("dplyr")
library("tidyr")
Testdf %>%
  select(FileName, Version, Value) %>%
  group_by(FileName, Version) %>%
  mutate(Index = 1:n()) %>%
  spread(Version, Value) %>%
  select(-Index)

如果始终可以假设每个FileName将有9个值,每个版本和类别的组合一个,那么这将起作用:

Testdf %>%
    select(FileName, Category, Version, Value) %>%
    spread(Version, Value) %>%
    select(-Category)

如果您想使用data.table,可以执行以下操作:

setDT(Testdf)[, split(Value, Version), by = FileName]

如果你想要LaTeX输出,那么你可以进一步将输出传递给xtable::xtable