首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据一个矩阵中的值获取另一个矩阵中列的值?

如何根据一个矩阵中的值获取另一个矩阵中列的值?
EN

Stack Overflow用户
提问于 2017-12-19 03:37:30
回答 1查看 31关注 0票数 0

数据

我有两个矩阵。traf_id在两列中表示两个红绿灯的ID (如果红绿灯离汽车最近,则它位于第一列)。第二个矩阵traf_state表示交通灯的状态(1 =红色,2=绿色)(同样,最近的灯的状态放在第一列中)。

代码语言:javascript
复制
traf_id <- matrix(data = c(rep(12353,4), rep(12453,4),  rep(12453,4), rep(12353,4)), nrow = 8, ncol = 2)
      [,1]  [,2]
[1,] 12353 12453
[2,] 12353 12453
[3,] 12353 12453
[4,] 12353 12453
[5,] 12453 12353
[6,] 12453 12353
[7,] 12453 12353
[8,] 12453 12353  


traf_state <- matrix(data = c(rep(1,8), rep(2,8)), nrow = 8, ncol = 2)
     [,1] [,2]
[1,]    1    2
[2,]    1    2
[3,]    1    2
[4,]    1    2
[5,]    1    2
[6,]    1    2
[7,]    1    2
[8,]    1    2  

在上面的数据中,在前4个时间帧( traf_state等于1)中,红绿灯12353离汽车最近,因此放在第一列。从第5帧到第8帧,12453是最接近的帧。

我想做的是

我想创建一个有3列的数据框。第一个应为time frame列,其他两个应包含给定时间范围内给定红绿灯的交通状态:

代码语言:javascript
复制
foo <- data.frame(frames = 1:8, state_12353 = c(rep(1,4), rep(2,4)), state_12453 = c(rep(2,4), rep(1,4)))
> foo
  frames state_12353 state_12453
1      1           1           2
2      2           1           2
3      3           1           2
4      4           1           2
5      5           2           1
6      6           2           1
7      7           2           1
8      8           2           1 

请指导我dplyr中的哪些函数与创建上述数据框相关。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-19 03:57:55

您似乎有表示时间范围的行和表示红绿灯与汽车的相对位置的列;要将红绿灯id与其状态相匹配,您需要收集长格式的原始数据,以便坐标(时间和位置)成为两个单独的列,然后可以连接它们:

代码语言:javascript
复制
# make the data frames
traf_id_df <- data.frame(traf_id, frames = 1:8)
traf_state_df <- data.frame(traf_state, frames = 1:8)

library(dplyr); library(tidyr)
inner_join(
    gather(traf_id_df, Distance, Id, -frames), 
    gather(traf_state_df, Distance, State, -frames)
) %>% 
    select(-Distance) %>% 
    mutate(Id = paste0("state_", Id)) %>% 
    spread(Id, State)

#  frames state_12353 state_12453
#1      1           1           2
#2      2           1           2
#3      3           1           2
#4      4           1           2
#5      5           2           1
#6      6           2           1
#7      7           2           1
#8      8           2           1

或者,由于两个矩阵中的元素彼此对应,您可以按元素方式绑定这两个矩阵,然后重塑:

代码语言:javascript
复制
cbind(
    seq_len(nrow(traf_id)), 
    as.vector(traf_id), 
    as.vector(traf_state)
) %>% as.data.frame() %>% 
    setNames(c('frames', 'id', 'state')) %>% 
    mutate(id = paste0('state_', id)) %>% 
    spread(id, state)

#  frames state_12353 state_12453
#1      1           1           2
#2      2           1           2
#3      3           1           2
#4      4           1           2
#5      5           2           1
#6      6           2           1
#7      7           2           1
#8      8           2           1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47875288

复制
相关文章

相似问题

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