2017-06-30 6 views
1

私は別個のイベント(以下「A」、「B」、「C」と表記)を特徴付けるcsvからRで作業しています。私はイベント内での動作のシーケンス(以下「x」、「y」、「z」)に興味がありますが、イベントは複数の行に分けられます。私が興味を持っている質問については、イベントごとに1行で一連の行動を整列させたいと思います。これは私が私のデータは次のようになりたいものですIDの変数に基づいて異なる長さの行をマージする方法R

Behavior 1 | Behavior 2 | Behavior 3 | Behavior 4 | Behavior 5 
A | x   | x   |    |    | 
A | y   |    |    |    | 
B | y   | x   |    |    | 
C | y   | z   | x   |    | 
C | x   |    |    |    | 

 Behavior 1 | Behavior 2 | Behavior 3 | Behavior 4 | Behavior 5 
A | x   | x   | y   |    | 
B | y   | x   |    |    | 
C | y   | z   | x   | x   | 
私はこれが私のデータがどのように見えるかでトラブルR.

でこれを行う方法を考え出すを抱えています

ご協力いただきありがとうございます!

答えて

1

私は、彼らが使用するのが比較的容易であるとして、あなたは、Rでdplyr tidyrパッケージに慣れてもらう示唆しています。データwranlgingのチートシートhttps://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdfをつかむと、ここに行く:

event <- c("A", "A", "B", "C", "C") 
behavior1 <- c("x", "y","y", "y", "x") 
behavior2 <- c("x", "","x", "z", "") 
behavior3 <- c("", "","", "x", "") 
behavior4 <- c("", "","", "", "") 
behavior5 <- c("", "","", "", "") 
df <- data.frame(event, behavior1, behavior2,behavior3,behavior4,behavior5, stringsAsFactors =F) 
df 

library(tidyr) 
library (dplyr) 
#make table flat 
df2 <- gather(df, behavior, outcome, -event) 
df2 
#remove empty rows and sort (sort is only to make it easier to understand) 
df3 <- df2 %>% filter(outcome != "") %>% arrange(event) 
df3 
#create row number per event 
df4 <- df3 %>% group_by(event) %>% mutate (t = row_number(), behavior_new=paste("Behavior", t)) 
df4 

#drop old behavir and t column 
df5 <- df4 %>% select (-behavior, -t) 
df5 

#spread out bevhavior again 
spread(df5, behavior_new, outcome) 

PSを:あなたの次の質問のために、より良いスタイルで質問をするこの質問と最初の答えHow to make a great R reproducible example?を確認してください。

1

あなたが何らかの理由で他のパッケージを使用しないようにしたい場合あるいは、あなたがこれを行うことができます:

beh <- matrix(c("A", "A", "B", "C", "C", 
    "x", "y", "y", "y", "x", 
    "x", NA, "x", "z", NA, 
    NA, NA, NA, "x", NA, 
    NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA), 
    ncol=6) 

ret.list <- list() 
events <- unique(beh[,1]) 

for(evt in events) 
{ 
    sel <- beh[,1] == evt 
    row <- na.omit(as.vector(t(beh[sel, -1]))) 
    ret.list[[evt]] <- as.vector(row) 
} 

# if you want a matrix instead: 
max.beh <- max(unlist(lapply(ret.list, length))) 

ret.mat <- matrix(NA, nrow=length(events), ncol=max.beh) 
for(i in 1:length(events)) 
{ 
    evt.beh <- ret.list[[events[i]]] 
    ret.mat[i, 1:length(evt.beh)] <- evt.beh 
} 

rownames(ret.mat) <- events 
colnames(ret.mat) <- paste("Behavior", 1:max.beh) 

これだけのNAを取り除く、行およびペーストのリスト項目へのイベントからのラベルの上に行きます。代わりに行列が必要な場合は、最も長いリスト項目をret.listに、ユニークイベントの数を見つけることによって次元が決定されます。リストアイテムは、適切な行に貼り付けられます。

関連する問題