如何在R中组合两个数据框(详见)?

时间:2015-09-30 21:10:22

标签: r

数据

我有2个数据框如下:

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是第二近的车辆。用户周围没有其他车辆,因此X3X5列包含零。

请注意: df没有位置;它有车辆识别号码。所以0表示没有车辆,10和15表示车辆ID 10和ID 15.它们不是顺序而且数字没有意义,因此10不是10英尺或第十辆车,它只是一个ID。我更喜欢A,B,......但我以ID号的格式获取数据。是的,我想将0视为NA。

第二个数据框具有相似的结构,但包含车辆的速度而不是ID:

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米/秒。

我想做什么?

我希望将这两个数据框组合起来创建一个新的数据框,如下所示:

> 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包的教程,但仍然无法弄清楚如何做

1 个答案:

答案 0 :(得分:4)

您可以使用tidyrdplyr

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
....