如何在3列数据框架上使用强制转换

时间:2013-11-14 17:06:27

标签: r reshape

在以下data.frame

Date1 <- seq(from = as.POSIXct("2010-05-01 02:00"), 
             to = as.POSIXct("2010-05-01 06:00"), by = 3600)
Dat <- data.frame(DateTime = Date1,
                  Temp = rnorm(length(Date1)),
                  height = c(1,2,3,4,5))
Dat2 <- data.frame(DateTime = Date1,
                   Temp = rnorm(length(Date1)),
                   height = c(1,2,3,4,5))

Dat3 <- rbind(Dat,Dat2)

我希望能够使用强制转换来重新构造data.frame,以便我在第一列中结束Time,然后在剩余列中结束temp,其中height的值用于定义哪一列每个值都进入。我已经看到重塑的演员被大量使用但如果我尝试

require(reshape)
cast(Dat3,Temp ~ height)

我收到错误

Using height as value column.  Use the value argument to cast to override this choice
Error in `[.data.frame`(data, , variables, drop = FALSE) : 
  undefined columns selected

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:4)

两点:

  1. 您正在使用已被“reshape2”软件包替换的旧版软件包。
  2. 如果有疑问,请尝试明确命名一些函数参数,以帮助查看函数的工作方式。
  3. 关于第一点,请参阅另一个答案。

    对于第二点,您可以尝试类似:

    cast(Dat3, DateTime ~ height, value = "Temp", fun.aggregate = mean)
    

    (对于上述类似的“reshape2”版本,您将使用dcast(Dat3, DateTime ~ height, value.var="Temp", fun.aggregate=mean)

    让我们打破这一点(也适用于其他答案)。

    • 告诉cast(或最好dcast)您正在使用哪些数据。
    • 指定一个formula,用于描述您想要的~左侧的“固定”列(如ID变量),以及应成为聚合值列名的内容。 / LI>
    • 指定value变量(或value.var中的dcast)作为要执行聚合的变量。
    • 指定您的聚合函数(默认情况下,它是长度,在我的示例中为mean)。

    认为cast中发生了这种情况,因为formula的解析方式以及猜测不同变量的方式。在“重塑”中,如果我没记错,如果你仔细查看代码,如果没有指定value参数,则函数为:

    • 尝试查找名为“value”的变量,如果找到,则将其用作value参数。
    • 如果找不到,则使用data.frame中最后一个(最右侧)列作为value列的任何列。
    • 如果最后一列恰好已经在formula中命名 - 就像在您的示例中那样 - 该列不可用于该函数作为value的值参数,所以你得到这个错误。

    关于最后一点,“reshape2”没有这个问题,你可以重复使用多个参数的变量。

    要自行查看代码,请在提示符处输入castreshape1,然后在提示符处加载“reshape”,并在提示符处输入dcastreshape2:::cast reshape2“包加载。你可能需要进一步挖掘,因为这两个都使用了Hadley作为包的一部分写的一些其他函数。

答案 1 :(得分:1)

编辑:

您可以尝试使用reshape2

require(reshape2)
dcast(Dat3,DateTime ~ height)

我还编辑了你的示例数据,以便明确,(据我所知)

Date1 <- seq(from = as.POSIXct("2010-05-01 02:00"), 
             to = as.POSIXct("2010-05-01 06:00"), by = 3600)

dat3<-data.frame(DateTime=Date1, Temp=rnorm(25),height=rep(c(1:5), each=5))

数据:

> dat3
              DateTime       temp height
1  2010-05-01 02:00:00 -0.1528124      1
2  2010-05-01 03:00:00 -0.1212748      1
3  2010-05-01 04:00:00 -0.3402005      1
4  2010-05-01 05:00:00 -0.4789695      1
5  2010-05-01 06:00:00  1.0711143      1
6  2010-05-01 02:00:00  0.5340149      2
7  2010-05-01 03:00:00 -0.6660925      2
8  2010-05-01 04:00:00  2.6568830      2
9  2010-05-01 05:00:00 -0.1686520      2
10 2010-05-01 06:00:00  0.5323944      2
11 2010-05-01 02:00:00  1.0419971      3
12 2010-05-01 03:00:00 -1.2008618      3
13 2010-05-01 04:00:00  1.3663645      3
14 2010-05-01 05:00:00 -0.7694349      3
15 2010-05-01 06:00:00  0.6992724      3
16 2010-05-01 02:00:00  1.3105646      4
17 2010-05-01 03:00:00 -0.9245039      4
18 2010-05-01 04:00:00 -1.8716493      4
19 2010-05-01 05:00:00 -1.2540669      4
20 2010-05-01 06:00:00  0.2525718      4
21 2010-05-01 02:00:00 -1.1807661      5
22 2010-05-01 03:00:00 -0.8894825      5
23 2010-05-01 04:00:00 -1.7290931      5
24 2010-05-01 05:00:00 -0.5112744      5
25 2010-05-01 06:00:00 -0.1841737      5

重塑形式的代码

require(reshape2)
dcast(dat3,DateTime ~ height, value.var="Temp")

重塑数据

> dcast(dat3,DateTime ~ height, value.var="Temp")
             DateTime          1          2          3          4          5
1 2010-05-01 02:00:00 -0.1528124  0.5340149  1.0419971  1.3105646 -1.1807661
2 2010-05-01 03:00:00 -0.1212748 -0.6660925 -1.2008618 -0.9245039 -0.8894825
3 2010-05-01 04:00:00 -0.3402005  2.6568830  1.3663645 -1.8716493 -1.7290931
4 2010-05-01 05:00:00 -0.4789695 -0.1686520 -0.7694349 -1.2540669 -0.5112744
5 2010-05-01 06:00:00  1.0711143  0.5323944  0.6992724  0.2525718 -0.1841737