首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得R数据帧中新列中变量的唯一值?

如何获得R数据帧中新列中变量的唯一值?
EN

Stack Overflow用户
提问于 2015-04-21 20:31:55
回答 1查看 1K关注 0票数 0

样本数据

代码语言:javascript
复制
mydf <- data.frame(Vehicle.ID = c(1,1,1,1,1,1,1,1), Frame.ID = c(1,2,3,4,5,6,7,8),
           Lane = c(1,1,2,2,2,3,3,3), lane.change = c(".", ".", "yes", ".", ".","yes",".","."),
           Preceding.Vehicle.ID = c(10,10,5,5,5,6,6,6),
           Following.Vehicle.ID = c(20,20,50,50,50,30,30,30))

数据描述

Vehicle.ID:车辆的ID

Frame.ID:帧号(1帧=0.1秒)

lane :当前占用的车道数

lane.change:“意思是车辆没有改变这个车架中的车道,而“是”表示车辆在这个车架上改变车道。

Preceding.Vehicle.IDFollowing.Vehicle.ID:in的车辆在前面和后面的车辆在当前车道,在给定的框架。

我想做的是:

我想找到:

  1. 车辆占用的所有车道。现时的行车线载於“行车”栏内。车辆移动到的所有其他车道都是目标车道。我想要创建新的列,包含所有目标车道的车道号码,如target.lane1target.lane2,等。
  2. 类似地,我希望将所有前面的车辆ID和下面的车辆ID放在新列中,即目标车道1和2中的前面车辆: PVtl1,PVtl2,以及目标车道1和2中的后续车辆: FVtl1,FVtl2。

所需数据框架的最终形式:

代码语言:javascript
复制
mydf.final <- mydf %>%
  mutate(target.lane1 = 2, PVtl1 = 5, FVtl1 = 50, 
         target.lane2 = 3, PVtl2 = 6, FVtl2 = 30)

我试过的是:

老实说,我不知道该怎么做。我试着用:

代码语言:javascript
复制
> mydf <- mydf %>%
+   mutate(pvtl1 = data.frame(unique(Preceding.Vehicle.ID)))
Error: not compatible with STRSXP

但要像你看到的那样得到错误。

请引导我。我想为此使用dplyr

编辑:

我尝试过使用for loop,它对这个示例数据起了作用:

代码语言:javascript
复制
for (i in 1:length(unique(mydf$Lane))){
  mydf[,paste("target.lane",i, sep=".")] =  unique(mydf$Lane)[i]
  mydf[,paste("PVtl",i, sep=".")] =  unique(mydf$Preceding.Vehicle.ID)[i]
  mydf[,paste("FVtl",i, sep=".")] =  unique(mydf$Following.Vehicle.ID)[i]
}

在这里,target t.lane.1,PVtl1和FVtl1是无用的,因为它们只是包含了当前第一车道的信息,而这不是目标车道,所以我可以稍后删除它们。

但是原始数据很大,而且还有更多独特的Vehicle.IDs。使用for loop似乎不是一个明智的想法。如何使用dplyr更快地实现同样的目标?

编辑2(为我工作的dplyr解决方案)

看来今天没人在帮忙。我想出了一个dplyr解决方案,如果有大约8条车道的改变,它可以应用:

代码语言:javascript
复制
mydf %>%
  mutate(ul = n_distinct(Lane),
         target.lane.1 = unique(Lane)[ul - (ul-2)],
         PVtl1 = Preceding.Vehicle.ID[match(target.lane.1, Lane)],
         FVtl1 = Following.Vehicle.ID[match(target.lane.1, Lane)],
         target.lane.2 = unique(Lane)[ul - (ul-3)],
         PVtl2 = Preceding.Vehicle.ID[match(target.lane.2, Lane)],
         FVtl2 = Following.Vehicle.ID[match(target.lane.2, Lane)],
         target.lane.3 = unique(Lane)[ul - (ul-4)],
         PVtl3 = Preceding.Vehicle.ID[match(target.lane.3, Lane)],
         FVtl3 = Following.Vehicle.ID[match(target.lane.3, Lane)],
         target.lane.4 = unique(Lane)[ul - (ul-5)],
         PVtl4 = Preceding.Vehicle.ID[match(target.lane.4, Lane)],
         FVtl4 = Following.Vehicle.ID[match(target.lane.4, Lane)],
         target.lane.5 = unique(Lane)[ul - (ul-6)],
         PVtl5 = Preceding.Vehicle.ID[match(target.lane.5, Lane)],
         FVtl5 = Following.Vehicle.ID[match(target.lane.5, Lane)],
         target.lane.6 = unique(Lane)[ul - (ul-7)],
         PVtl6 = Preceding.Vehicle.ID[match(target.lane.6, Lane)],
         FVtl6 = Following.Vehicle.ID[match(target.lane.6, Lane)],
         target.lane.7 = unique(Lane)[ul - (ul-8)],
         PVtl7 = Preceding.Vehicle.ID[match(target.lane.7, Lane)],
         FVtl7 = Following.Vehicle.ID[match(target.lane.7, Lane)],
         target.lane.8 = unique(Lane)[ul - (ul-9)],
         PVtl8 = Preceding.Vehicle.ID[match(target.lane.8, Lane)],
         FVtl8 = Following.Vehicle.ID[match(target.lane.8, Lane)],
         target.lane.9 = unique(Lane)[ul - (ul-10)],
         PVtl9 = Preceding.Vehicle.ID[match(target.lane.9, Lane)],
         FVtl9 = Following.Vehicle.ID[match(target.lane.9, Lane)],
         target.lane.final = unique(Lane)[ul],
         PVtlf = Preceding.Vehicle.ID[match(target.lane.final, Lane)],
         FVtlf = Following.Vehicle.ID[match(target.lane.final, Lane)])

不过,我还是想修改我的代码,以便根据观察到的车道更改的数量创建新列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 15:24:57

我将通过创建一个具有新的感兴趣列的数据集,然后使用left_join将新的数据集重新加入到原始数据集中来实现这一点。我将观察到的车道变化的数量信息添加到数据集中,因此新列的数量可以基于观察到的车道更改的数量。大部分工作是重新塑造数据集,使用来自tidyr的函数创建新的列标题(使用gatherunite),然后生成新列(spread)。我没有按期望的顺序放置新列,但您当然可以这样做。

如果您有多个Vehicle.ID值,下面的代码应该可以工作。如果您只有一个Vehicle.ID,则不需要group_by

代码语言:javascript
复制
library(dplyr)
library(tidyr)

mydf %>%
    filter(lane.change == "yes") %>%
    group_by(Vehicle.ID) %>%
    mutate(order = 1:n()) %>%
    select(-Frame.ID, -lane.change) %>%
    rename(target.lane = Lane,  Pvtl = Preceding.Vehicle.ID, FVtl = Following.Vehicle.ID) %>%
    gather(group, number, target.lane, Pvtl, FVtl) %>%
    unite(group1, group, order, sep = "") %>%
    spread(group1, number) %>%
    left_join(mydf, .)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29782557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档