如何在for循环中使用if else语句来创建新列?

时间:2013-09-30 05:24:36

标签: r if-statement for-loop dataframe

我在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'是数据帧的名称。请帮助修复代码。

2 个答案:

答案 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,那么这就完全是外部自联接。