2017-12-18 12 views
0

データ

私は2つの行列を持っています。 traf_idは、2つの列の2つの信号灯のIDを表します(信号灯が車に最も近い場合は、最初の列にあります)。第2の行列traf_stateは、信号光の状態(1 =赤と2 =緑)を表す(再び、最も近い光の状態が第1の列に入れられる)。上記データにおいて別の行列の値に基づいて行列の列の値を取得する方法はありますか?

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 

、トラフィック光12353は、第4の時間フレーム(1に等しいtraf_state有する)のために車に最も近いため、最初の列に入れました。フレーム5から8までは、12453が最も近いフレームです。私は3列のデータフレームを作成したい

をやりたい

。最初は時間枠の列でなければなりませんし、他の2つは、与えられた時間枠のために与えられたトラフィックの光のトラフィック状態が含まれている必要があります。

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のどの機能私を導いてください。

答えて

1

時間枠を表す行と、交通信号灯の車に対する相対位置を表す列があるようです。

# 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 

または要素になったのは:その状態で信号機IDと一致するには、座標(時間と位置が)あなたが、その後に参加することができる2つの別々の列になるように、長い形式に元のデータを収集する必要があります2つの行列が相互に対応している場合、2つの行列を要素ごとにバインドしてから、再構成することができます。

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 
関連する問題