将sql结果重新格式化为R中的矩阵

时间:2013-01-16 16:39:03

标签: r reshape

我使用以下方法从R中的SQL数据框中检索数据:

query <- "SELECT date, identifier, somevalue FROM mytable"
data <- sqlQuery(conn, query)

这给了我:

> data
        date identifier somevalue
1 2011-01-01          1      0.50
2 2011-01-02          1      0.40
3 2011-01-01          2      0.70
4 2011-01-02          2      0.10
5 2011-01-03          2      0.25

data <- data.frame(date=c("2011-01-01","2011-01-02","2011-01-01","2011-01-02","2011-01-03"), identifier=c(1,1,2,2,2), somevalue=c(0.5,0.4,0.7,0.1,0.25))

我想将此转换为数字矩阵,使用日期作为rownames和标识符作为colnames:

> output
             1    2
2011-01-01 0.5 0.70
2011-01-02 0.4 0.10
2011-01-03  NA 0.25

output <- matrix(c(0.5,0.4,NA,0.7,0.1,0.25),3)
rownames(output) <- c("2011-01-01","2011-01-02","2011-01-03")
colnames(output) <- c(1,2)

我无法弄清楚如何做到这一点。我查看了reshape以及match但我总是因为有重复的rownames或标识符而失败。

1 个答案:

答案 0 :(得分:2)

我通常使用 reshape2 中的dcast(但有很多方法可以做到这一点):

dcast(data,
      date~identifier,
      fun.aggregate = sum,
      value.var = "somevalue",
      fill = NA_real_)
        date   1    2
1 2011-01-01 0.5 0.70
2 2011-01-02 0.4 0.10
3 2011-01-03  NA 0.25

step1 <- dcast(data,
               date~identifier,
               fun.aggregate = sum,
               value.var = "somevalue",
               fill = NA_real_)
m <- as.matrix(step1[,-1])
rownames(m) <- step1$date
> m
             1    2
2011-01-01 0.5 0.70
2011-01-02 0.4 0.10
2011-01-03  NA 0.25

我遇到的一次打嗝是使用“正确的”NA值,在这种情况下是NA_real_dcast如果我尝试NANA_integer_这对我来说没有多大意义,那么就会抛出错误,但我已经很久没有考虑过了。

编辑好的,现在我明白了。 NA类型显然需要匹配其余数据的类型。我希望dcast能够转换为适当的NA类型,但我猜不是。