如何在R中创建转换列
我在数据框中有一个状态列,我想创建两个新列: 一个是展望下一阶段的变化,一个是回顾前一阶段的状态变化。因此,生成的数据帧如下所示:如何在R中创建转换列,r,dataframe,R,Dataframe,我在数据框中有一个状态列,我想创建两个新列: 一个是展望下一阶段的变化,一个是回顾前一阶段的状态变化。因此,生成的数据帧如下所示: 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
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
或者更好,但现在您只需创建两个过渡列:
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”,因为它令人困惑让我们给该数据帧命名,比如“inp”。使用
rle
函数构建“状态”序列:
>rle(inp$状态)
游程编码
长度:int[1:4]42
值:chr[1:4]“a”“b”“1”“a”
runinp多亏了DWin的回答,我自己从问题中找到了第二部分的答案。
以下是创建带有transitions列的数据帧的完整代码:
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
state=rep(c('a','b','c','a'),c(4,3,3,2))
inp=数据帧(状态,VAL=rnorm(12))
runinps=rle(as.character(inp$state))#没有as.character无法工作
(rs事实上,我完全不确定你想做什么。尽管你可能想看看转换。你的输入到底是什么,输出应该是什么?1让我不舒服。既然你已经概述了这个概念,你能提供一个真实数据的例子吗?很抱歉混淆了。这是因为我在用睡眠工作数据。在睡眠研究中,我们有5个睡眠阶段:阶段1到3,唤醒阶段和快速眼动睡眠。我想收集从一个睡眠阶段到另一个睡眠阶段的所有转换。我现在已经将这些转换为c。
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