0

データフレームに状態列があり、2つの新しい列を作成したいと思います。1つは次のステージの変更を先読みし、もう1つは前の状態の変更を振り返ります。したがって、結果のデータフレームは次のようになります。

state coming  previous
  a     a-b     NA
  a     a-b     NA
  a     a-b     NA
  a     a-b     NA
  b     b-c     a-b
  b     b-c     a-b
  b     b-c     a-b
  c     c-a     b-c
  c     c-a     b-c
  c     c-a     b-c
  a     NA      c-a
  a     NA      c-a

または、さらに良いかもしれませんが、ここでは2つの遷移列を作成するだけです。

state trans1   trans2
  a     a-b     NA
  a     a-b     NA
  a     a-b     NA
  a     a-b     NA
  b     a-b     b-c 
  b     a-b     b-c
  b     a-b     b-c
  c     c-a     b-c
  c     c-a     b-c
  c     c-a     b-c
  a     c-a     NA 
  a     c-a     NA

[編集]混乱したため、「1」という名前の状態を「c」に変更しました

4

2 に答える 2

1

そのデータフレームに「inp」という名前を付けましょう。この関数を使用してrle、「状態」のシーケンスを作成します。

> rle(inp$state)
Run Length Encoding
  lengths: int [1:4] 4 3 3 2
  values : chr [1:4] "a" "b" "1" "a"

runinp <- rle(inp$state)$values
paste( runinp[-length(runinp)], runinp[-1], sep="-")
# [1] "a-b" "b-1" "1-a"
inp$coming <- rep( c( paste( runinp[-length(runinp)], runinp[-1], sep="-"), NA), 
                    rle(inp$state)$lengths )
inp$coming
# [1] "a-b" "a-b" "a-b" "a-b" "b-1" "b-1" "b-1" "1-a" "1-a" "1-a" NA    NA   

inp$previous <- 
 rep( c( NA_character_, paste(runinp[-1], runinp[-length(runinp)], sep="-")), 
      rle(inp$state)$lengths )
inp$previous
 [1] NA    NA    NA    NA    "b-a" "b-a" "b-a" "1-b" "1-b" "1-b" "a-1" "a-1"

(私はあなたの最初の要求を理解することで私の困難を克服することができましたが、2番目の部分で永続的な困難を抱えていました。)

于 2012-06-12T13:13:59.860 に答える
0

DWinの回答のおかげで、私は自分の質問の2番目の部分に対する回答を見つけました。遷移列を持つデータフレームを作成するための完全なコードは次のとおりです。

state = rep(c('a','b','c','a'), c(4,3,3,2))
inp=data.frame(state, vals=rnorm(12))
runinps=rle(as.character(inp$state)) # doesn't work without as.character

(rs <- runinps$values)
(ls=runinps$lengths)

(inp$coming <- rep( c( paste( rs[-length(rs)], rs[-1], sep="-"), NA), ls ))
(inp$previous <-rep( c( NA, paste(rs[-length(rs)], rs[-1], sep="-")), ls ))

# Create the first transitions column
(reps=rep(1:(length(ls)/2),each=2))
(ls2=as.vector(tapply(ls , reps, sum)))
seqRs=seq(from=1,to=length(rs),by=2)
(inp$trans <- rep(paste( rs[seqRs], rs[seqRs+1], sep="-"), ls2 ))

# Create the second transitions column
reps=c(reps[-1], max(reps)+1)
(ls2=as.vector(tapply(ls , reps, sum)))
seqRs=seq(from=2,to=length(rs)-1,by=2)
(inp$trans2 <- rep(c(NA, paste( rs[seqRs], rs[seqRs+1], sep="-"), NA), ls2 ))

# some last commands to create one transition column
inp2=subset(inp,!is.na(inp$trans2))
inp2$trans=inp2$trans2
inp=rbind(inp,inp2)
inp$trans2<-NULL
于 2012-06-12T19:59:03.233 に答える