根据R代码中特定值的运行长度计算变量
我有一个这样的数据集根据R代码中特定值的运行长度计算变量,r,run-length-encoding,R,Run Length Encoding,我有一个这样的数据集 dat <- data.frame(d1=c(0,1,0,1,0), d2=c(0,1,1,1,0),d3=c(1,0,1,1,0), d4=c(1,0,0,0,0),d5=c(1,1,1,0,0)) dat d1 d2 d3 d4 d5 1 0 0 1 1 1 2 1 1 0 0 1 3 0 1 1 0 1 4 1 1 1 0 0 5 0 0 0 0 0 d1 d2 d3 d4
dat <- data.frame(d1=c(0,1,0,1,0),
d2=c(0,1,1,1,0),d3=c(1,0,1,1,0),
d4=c(1,0,0,0,0),d5=c(1,1,1,0,0))
dat
d1 d2 d3 d4 d5
1 0 0 1 1 1
2 1 1 0 0 1
3 0 1 1 0 1
4 1 1 1 0 0
5 0 0 0 0 0
d1 d2 d3 d4 d5 indicator
1 0 0 1 1 1 3
2 1 1 0 0 1 1
3 0 1 1 0 1 1
4 1 1 1 0 0 2
5 0 0 0 0 0 5
我试过这样做
indicator <- NULL
for(i in 1:5){
indicator[i] <- rev(sequence(rle(dat[i,])$lengths))[1]
}
indicator[1:5]
cbind(dat, indicator=indicator[1:5])
有人能帮我解决这个问题吗?试试看
val <- apply(dat, 1, function(x) with(rle(rev(x)==1), lengths[values])[1])
dat$indicator <- replace(val, is.na(val),0)
dat
# d1 d2 d3 d4 d5 indicator
#1 0 0 1 1 1 3
#2 1 1 0 0 1 1
#3 0 1 1 0 1 1
#4 1 1 1 0 0 3
#5 0 0 0 0 0 0
val另一种方法:
x = apply(rev(dat),1, function(u) ifelse(u[1]==1, match(0,u)-1, match(1,u)))
transform(dat, indicator = ifelse(is.na(x), 0,x))
# d1 d2 d3 d4 d5 indicator
#1 0 0 1 1 1 3
#2 1 1 0 0 1 1
#3 0 1 1 0 1 1
#4 1 1 1 0 0 3
#5 0 0 0 0 0 0
没错,我尝试了其他解决方案,使用矩阵作为矢量化解决方案,并保留了该命令!编辑。
x = apply(rev(dat),1, function(u) ifelse(u[1]==1, match(0,u)-1, match(1,u)))
transform(dat, indicator = ifelse(is.na(x), 0,x))
# d1 d2 d3 d4 d5 indicator
#1 0 0 1 1 1 3
#2 1 1 0 0 1 1
#3 0 1 1 0 1 1
#4 1 1 1 0 0 3
#5 0 0 0 0 0 0