我有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是第二近的车辆。用户周围没有其他车辆,因此X3
到X5
列包含零。
请注意: 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
包的教程,但仍然无法弄清楚如何做
答案 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
....