1

我使用以下方法从 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))

我想将其转换为使用日期作为行名和标识符作为列名的数字矩阵:

> 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但由于有重复的行名或标识符,我总是失败。

4

1 回答 1

2

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

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 类型,但我想不会。

于 2013-01-16T16:44:48.597 回答