2015-01-23 2 views
1

У меня есть два кадра данных, что мне нужно вычесть те же столбцы, за время и сохранить результаты в другом фрейме данных:Как вычесть два кадра данных друг от друга в R

dput (т)

structure(list(time = structure(c(2L, 1L, 3L), .Label = c("1/13/15 1:18 PM", 
"1/13/15 12:18 PM", "1/13/15 2:18 PM"), class = "factor"), web01 = c(24083L, 
24083L, 24083L), web03 = c(24083L, 24083L, 24083L)), .Names = c("time", 
"web01", "web03"), class = "data.frame", row.names = c(NA, -3L 
)) 

dput (д) кадр

structure(list(time = structure(c(2L, 1L, 3L), .Label = c("1/13/15 1:18 PM", 
"1/13/15 12:18 PM", "1/13/15 2:18 PM"), class = "factor"), web01 = c(7764.8335, 
7725, 7711.5), web03 = c(10885.5, 10582.333, 10104.5)), .Names = c("time", 
"web01", "web03"), class = "data.frame", row.names = c(NA, -3L 
)) 

данных и т д только образец, мои фактические кадры данных имеют 20 столбцов. Кадры данных t и d в этом случае имеют одинаковые имена столбцов, и время будет одинаковым для каждой строки для обоих фреймов данных.

Мне нужно вычесть d из d за тот же период времени и сохранить результат в другом кадре данных. Любые идеи, как я мог бы сделать это в R

ответ

6

Update

rbind_list и rbind_all устарели. Вместо этого используйте bind_rows.

На основе обсуждений в комментариях и вдохновленные Эндрю ответ:

library(dplyr) 
df <- bind_rows(d,t) %>% 
    group_by(time = as.POSIXct(time, format="%m/%d/%Y %I:%M %p")) %>% 
    summarise_each(funs(diff(.))) %>% 
    data.frame() 

Это будет держать время в хронологическом порядке и конвертировать результат в регулярном data.frame()

+1

Спасибо Стивен! Я начал редактировать свой пост, чтобы отразить ваши дополнения, но это работает лучше. –

+0

Спасибо вам, это здорово. – user1471980

+1

Если вы хотите сохранить несколько нажатий клавиш, вы можете создать столбец группировки времени внутри group_by и удалить предыдущий шаг мутанта. 'group_by (time = as.POSIXct (time, format ="% m /% d /% Y% I:% M% p "))' –

2

Использование dplyr:

newdata<- 
    rbind_list(d,t) %>% 
    group_by(time) %>% 
    summarise_each(funs(diff(.))) 



       time web01 web03 
1 1/13/15 1:18 PM 16358.00 13500.67 
2 1/13/15 12:18 PM 16318.17 13197.50 
3 1/13/15 2:18 PM 16371.50 13978.50 
+0

Как я уже говорил, у моих фактических кадров данных есть 21 столбец. когда я делаю newdata, он говорит что-то вроде этого: ource: локальный фрейм данных [168 x 21] , переменные не отображаются. Как я могу увидеть весь фрейм данных newdata? – user1471980

+0

Обратите внимание, что это изменит порядок времени. Могу ли я предложить: 'df <- rbind_list (d, t)%>% mutate (time = as.POSIXct (time, format ="% m /% d /% Y% I:% M% p "))%> % group_by (время)%>% summaryise_each (funs (diff (.)))%>% аранжировка (время) ' –

+0

@ user1471980 Вы видите это, потому что' newdata' находится в 'tbl_df'. См. Http://stackoverflow.com/questions/23188900/view-entire-dataframe-when-wrapped-in-tbl-df –

3

Вот data.table подход :

library(data.table) 
rbindlist(list(d,t))[, lapply(.SD, diff), 
       by = .(time = as.POSIXct(time, format="%m/%d/%y %I:%M %p"))] 

#     time web01 web03 
#1: 2015-01-13 12:18:00 16318.17 13197.50 
#2: 2015-01-13 13:18:00 16358.00 13500.67 
#3: 2015-01-13 14:18:00 16371.50 13978.50 

Редактировать: скорректированный формат даты и выход, удалены .SDcols = ....

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