我在R中从文本文件中导入了4列和1180598行数据。以下是前五行数据:
Vehicle ID Time Vehicle Class Preceding Vehicle
1 2 0.1 2 0
2 2 0.2 2 0
3 2 0.3 2 0
4 2 0.4 2 0
5 2 0.5 2 0
上面最左边的列是索引。 “车辆ID”是特定“时间”的车辆ID,如“时间”列中所示。总共有2169辆车,但这里只显示了车辆2。 '车辆类'可以是1 =摩托车,2 =汽车或3 =卡车。在上面显示的数据中,它是汽车。 “前车辆”是“车辆ID”栏中提到的车辆前面的车辆的ID。
我想使用上面的信息创建一个新的'Preceding Vehicle Class'列。要让R找到Preceding Vehicle Class,它必须首先查看“Preceding Vehicle”列,然后查看“Vehicle ID”列,当它找到相同的ID时,应该看到“Vehicle Class”中的车辆类别列并将结果存储在新列“Preceding Vehicle Class”中。我尝试过以下代码,但加载时间超过5分钟,没有任何反应:
for (i in a[,'Preceding Vehicle']) for (j in a[,'Vehicle ID']) {
if (i==j) {pclass <- a[,'Vehicle ID']} else {pclass <- 0} }
a[,'Preceding Vehicle Class'] <- pclass
'a'是数据帧的名称。请帮助修复代码。
答案 0 :(得分:3)
使用以下版本的a
:
a <- structure(list(VehicleID = c(0L, 0L, 2L, 2L), Time = c(0.1, 0.2, 0.4, 0.5), VehicleClass = c(8L, 8L, 2L, 2L), PrecedingVehicle = c(-1L, -1L, 0L, 0L)), .Names = c("VehicleID", "Time", "VehicleClass", "PrecedingVehicle"), class = "data.frame", row.names = c("1", "2", "9", "10"))
看起来像:
VehicleID Time VehicleClass PrecedingVehicle
1 0 0.1 8 -1
2 0 0.2 8 -1
9 2 0.4 2 0
10 2 0.5 2 0
你可以这样做:
a$PrecVehClass <- a$VehicleClass[match(a$PrecedingVehicle,a$VehicleID)]
这将为您提供所需的结果:
VehicleID Time VehicleClass PrecedingVehicle PrecVehClass
1 0 0.1 8 -1 NA
2 0 0.2 8 -1 NA
9 2 0.4 2 0 8
10 2 0.5 2 0 8
答案 1 :(得分:1)
给出a
,就像在邮件的回答中一样:
new_a = merge(a, a[, c('VehicleID', 'VehicleClass')],
by.x='PrecedingVehicle',
by.y='VehicleID',
all.x=TRUE)
names(new_a) = c("PrecedingVehicle" ,"VehicleID","Time","VehicleClass",
"Preceding Vehicle Class")
所有处理实际上都是在第1行中使用merge
完成的。我只是没有找到更优雅的方式来处理列的重命名......
如果您熟悉SQL,那么这就完全是外部自联接。