2013-08-20 29 views
0

我有这样的数据帧:你如何重新组织数据帧中的R

  DATE pc  SERVER 
1 2013-02-16 01:00:00 3.83 server1 
2 2013-02-16 02:00:00 3.45 server1 
3 2013-02-16 03:00:00 3.34 server1 
4 2013-02-16 04:00:00 3.73 server1 
5 2013-02-16 05:00:00 3.16 server1 
6 2013-02-16 06:00:00 3.16 server1 
7 2013-02-16 01:00:00 4.74 server2 
8 2013-02-16 02:00:00 5.70 server2 
9 2013-02-16 03:00:00 8.54 server2 
10 2013-02-16 04:00:00 9.25 server2 
11 2013-02-16 05:00:00 10.12 server2 
12 2013-02-16 06:00:00 10.15 server2 

在服务器列有8台服务器。我需要在DATE将每台服务器分组。例如,

这是我需要这个DF来看看;

DATE    server1 server2 
2013-02-16 01:00:00 3.83  4.74 
2013-02-16 02:00:00 3.45  5.50 
2013-02-16 03:00:00 3.34  8.54 
2013-02-16 04:00:00 3.73  9.25 

我将如何做到这一点,重新安排我的数据帧

回答

2

这是一个非常基本的reshape问题。假设你data.frame被称为 “是myDF”:

> reshape(mydf, direction = "wide", idvar="DATE", timevar="SERVER") 
       DATE pc.server1 pc.server2 
1 2013-02-16 01:00:00  3.83  4.74 
2 2013-02-16 02:00:00  3.45  5.70 
3 2013-02-16 03:00:00  3.34  8.54 
4 2013-02-16 04:00:00  3.73  9.25 
5 2013-02-16 05:00:00  3.16  10.12 
6 2013-02-16 06:00:00  3.16  10.15 

另外,使用 “reshape2” 包:

> library(reshape2) 
> dcast(mydf, DATE ~ SERVER, value.var="pc") 
       DATE server1 server2 
1 2013-02-16 01:00:00 3.83 4.74 
2 2013-02-16 02:00:00 3.45 5.70 
3 2013-02-16 03:00:00 3.34 8.54 
4 2013-02-16 04:00:00 3.73 9.25 
5 2013-02-16 05:00:00 3.16 10.12 
6 2013-02-16 06:00:00 3.16 10.15 

如果您有重复 “DATE” 和 “服务器” 的组合,那么你需要为您的数据添加一个辅助“ID”变量。

下面是一些示例数据(请分享这种形式在未来的数据):

mydf <- structure(list(DATE = c("2013-02-16 01:00:00", "2013-02-16 02:00:00", 
    "2013-02-16 03:00:00", "2013-02-16 04:00:00", "2013-02-16 05:00:00", 
    "2013-02-16 06:00:00", "2013-02-16 01:00:00", "2013-02-16 02:00:00", 
    "2013-02-16 03:00:00", "2013-02-16 04:00:00", "2013-02-16 05:00:00", 
    "2013-02-16 06:00:00", "2013-02-16 01:00:00"), pc = c(3.83, 3.45, 
    3.34, 3.73, 3.16, 3.16, 4.74, 5.7, 8.54, 9.25, 10.12, 10.15, 
    5.83), SERVER = c("server1", "server1", "server1", "server1", 
    "server1", "server1", "server2", "server2", "server2", "server2", 
    "server2", "server2", "server1")), .Names = c("DATE", "pc", "SERVER" 
    ), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", 
    "10", "11", "12", "13"), class = "data.frame") 
mydf 
#     DATE pc SERVER 
# 1 2013-02-16 01:00:00 3.83 server1 
# 2 2013-02-16 02:00:00 3.45 server1 
# 3 2013-02-16 03:00:00 3.34 server1 
# 4 2013-02-16 04:00:00 3.73 server1 
# 5 2013-02-16 05:00:00 3.16 server1 
# 6 2013-02-16 06:00:00 3.16 server1 
# 7 2013-02-16 01:00:00 4.74 server2 
# 8 2013-02-16 02:00:00 5.70 server2 
# 9 2013-02-16 03:00:00 8.54 server2 
# 10 2013-02-16 04:00:00 9.25 server2 
# 11 2013-02-16 05:00:00 10.12 server2 
# 12 2013-02-16 06:00:00 10.15 server2 
# 13 2013-02-16 01:00:00 5.83 server1 

注意,因为重复的“日期” +“服务器”行1和13的组合,我们赢了如果没有收到你提到的警告,就不能使用reshape。解决办法:添加辅助ID

mydf$ID <- ave(as.character(mydf$DATE), mydf$DATE, mydf$SERVER, FUN = seq_along) 
reshape(mydf, direction = "wide", idvar=c("DATE", "ID"), timevar="SERVER") 
#     DATE ID pc.server1 pc.server2 
# 1 2013-02-16 01:00:00 1  3.83  4.74 
# 2 2013-02-16 02:00:00 1  3.45  5.70 
# 3 2013-02-16 03:00:00 1  3.34  8.54 
# 4 2013-02-16 04:00:00 1  3.73  9.25 
# 5 2013-02-16 05:00:00 1  3.16  10.12 
# 6 2013-02-16 06:00:00 1  3.16  10.15 
# 13 2013-02-16 01:00:00 2  5.83   NA 
+0

谢谢。我得到这个错误。这是一个好的错误:警告消息: 1:在reshapeWide(data,idvar = idvar,timevar = timevar,vary = vary,: 多行匹配SERVER = server1:首先采取 – user1471980

+0

@ user1471980,这是一个警告,不是这可能意味着你有“DATE”和“SERVER”列的重复组合,你可以尝试任何(重复的(mydf [c(“ DATE“,”SERVER“)]))'看看它是否返回TRUE或FALSE。 – A5C1D2H2I1M1N2O1R2T1

+0

它返回TRUE – user1471980

0

使用reshape包,你可以简单地做。考虑数据框df

df = data.frame(DATE = c("2013-02-16", "2013-02-17", "2013-02-18", "2013-02-16", "2013-02-17", "2013-02-18"), SERVER = c("server1","server1","server1","server2","server2","server2"), pc = c(1,2,3,4,5,6)) 

cast(df, DATE ~ SERVER, value = 'pc', mean) 

你得到:

 DATE server1 server2 
1 2013-02-16  1  4 
2 2013-02-17  2  5 
3 2013-02-18  3  6 
+0

你在哪里提到你的数据框名称你刚才选择了列名? – user1471980

+2

你知道“重塑”包有几乎b een被“reshape2”取代,对吧? – A5C1D2H2I1M1N2O1R2T1

+0

感谢您的信息。这仍然工作相当好,但。 – Mayou