2013-08-20 2 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 

На колонке SERVER есть 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 

Обратите внимание, что из-за дублированного «ДАТА» + «SERVER» сочетание в строках 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

спасибо. Я получаю эту ошибку. Это ошибка ok: Предупреждающие сообщения: 1: В reshapeWide (данные, idvar = idvar, timevar = timevar, variableing = changeing:: несколько строк соответствуют SERVER = server1: сначала приняты – user1471980

+0

@ user1471980, Это предупреждение, а не ошибка, но нет, я бы не стал считать это предупреждением ОК. Вероятно, это означает, что у вас есть дублированные комбинации столбцов «DATE» и «SERVER». Можете ли вы попробовать «any (duplicated (mydf [c (" DATE "," SERVER ")]))' и посмотрите, возвращает ли это TRUE или FALSE. – A5C1D2H2I1M1N2O1R2T1

+0

возвращает TRUE – user1471980

0

Используя reshape пакет, вы просто могли бы сделать. Рассмотрим dataframe 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

Вы знаете, что пакет «reshape» имеет в значительной степени b een заменен на «reshape2», верно? – A5C1D2H2I1M1N2O1R2T1

+0

Спасибо за информацию. Тем не менее, это все еще работает. – Mayou

Смежные вопросы