2015-09-30 3 views
2

данных

У меня 2 кадры данных следующим образом:Как объединить два кадра данных в R (см. Подробности)?

df <- data.frame(frames = 1:10, 
       X1 = c(0,0,0,10,10,10,10,15,15,15), 
       X2 = c(0,0,0,15,15,15,15,10,10,10), 
       X3 = rep(0,10), 
       X4 = rep(0,10), 
       X5 = rep(0,10)) 

Где
frames = Время номер кадра
X1, X2, ..., X5 содержит уникальный идентификационный номер транспортных средств. В любой момент времени X1 является ближайшим к пользователю (водитель в симуляторе вождения), X2 является ** второй ближайшей ** к пользователю и так далее. Например, в пункте frames 5 транспортное средство № 10 находится ближе всего к X1, а транспортное средство № 15 - второе. Других транспортных средств вокруг пользователя не было, поэтому столбцы X3 через X5 содержат нуль.

ПОЖЕРТВОВАТЬ ВНИМАНИЕ:df не имеет позиции; вместо этого он имеет идентификационный номер транспортного средства. Таким образом, 0 означает отсутствие транспортного средства, 10 и 15 являются идентификаторами автомобиля 10 и ID 15. Они не находятся в последовательности, и цифры не имеют значения, поэтому 10 не являются 10 футами или десятым транспортным средством, это всего лишь идентификатор. Я бы предпочел A, B, ... но я получаю данные в формате идентификационных номеров. И да, я хочу рассматривать 0 как НС.

Второй кадр данных имеет аналогичную структуру, но содержит скорость транспортных средств вместо идентификаторов:

df1 <- data.frame(frames = 1:10, 
       X1 = c(0.00,0.00,0.00,14.53,14.90,14.73,14.60,13.90,14.10,14.90), 
       X2 = c(0.00,0.00,0.00,12.57,12.80,13.10,13.60,14.65,14.70,14.79), 
       X3 = rep(0.00,10), 
       X4 = rep(0.00,10), 
       X5 = rep(0.00,10)) 

Пример: На frames 5, скорость транспортного средства # 10 был 14,90 м/с, и что из автомобиля # 15 - 12,80 м/с.

Что я хочу делать?

Я хочу объединить эти 2 кадры данных, чтобы создать новый, который выглядит следующим образом:

> df.final 
    ID frames speed 
1 10  4 14.53 
2 10  5 14.90 
3 10  6 14.73 
4 10  7 14.60 
5 10  8 14.65 
6 10  9 14.70 
7 10  10 14.79 
8 15  4 12.57 
9 15  5 12.80 
10 15  6 13.10 
11 15  7 13.60 
12 15  8 13.90 
13 15  9 14.10 
14 15  10 14.90 

Как я могу добиться этого? Я прочитал учебник tidyr пакета, но до сих пор не могу понять, как сделать

+0

Просто чтобы прояснить, кажется, что хотя ваши исходные фреймы данных 'df' и' df1' настроены для предоставления некоторой информации о позиции каждого транспортного средства относительно водителя, эта информация не интересует вас в вашем окончательном кадре данных? Кроме того, вы хотите обрабатывать 0 в идентификаторе транспортного средства или переменных скорости как NA, правильно? – tsurudak

+0

@tsurudak Спасибо за ваш ответ. 'df' не имеет позиции; вместо этого он имеет идентификационный номер транспортного средства. Таким образом, 0 означает отсутствие транспортного средства, 10 и 15 являются идентификаторами автомобиля 10 и ID 15. Они не находятся в последовательности. И да, я хочу рассматривать 0 как НС. –

ответ

4

использование решений в tidyr и dplyr вы можете сделать

library(tidyr) 
library(dplyr) 

## 'melt' the dataframes into long format 
## here, 'gather' is the tidyr equivalent of reshape2::melt 
df <- df %>% 
    gather(position, car_id, X1:X5) 

df1 <- df1 %>% 
    gather(position, speed, X1:X5) 

## merge (join) by frames and position 
df_final <- merge(df, df1, by=c("frames", "position")) 

## Alternatively you can used dplyr::inner_join 
## df_final <- inner_join(df, df1, by=c("frames","position")) 
## although you don't need the 'by' argument here as inner_join 
## detects the common/join columns 

## filter and sort the results 
df_final <- df_final %>% 
    filter(car_id != 0) %>% 
    arrange(car_id, frames) 

который дает

df_final 
    frames position car_id speed 
1  4  X1  10 14.53 
2  5  X1  10 14.90 
3  6  X1  10 14.73 
4  7  X1  10 14.60 
.... 
+0

Большое вам спасибо! –

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