考虑以下数据,其中左列表示位(1或0),右列表示我们观察该位的微秒数。
0 664
1 63
0 404
1 544
0 651
1 686
0 507
1 1155
0 664
1 271
0 456
1 2763
0 664
1 115
0 456
1 4010
0 664
1 63
0 351
1 3855
我想绘制这样的数据,使得水平线为0,宽度为664,然后上升到水平线为1,宽度为63,然后下降到水平线为0,宽度为404,依此类推。
是否有高效并直接在R中绘制此图,而不涉及手动比较边界?
这是我目前的代码,这是非常低效和天真的,所以我希望有更好的方法。
args <- commandArgs(trailingOnly = TRUE)
data = read.table(args[1])
current = 1
sumA = 0
pf = function(x) {
if (x < sumA) {
return(data[current,1])
}
for (i in current: length(data[,1])) {
sumA <<- sumA + data[i,2]
if (x < sumA) {
current <<- i + 1
return(data[i,1])
}
}
return("OUT OF BOUNDS")
}
cumSum = colSums(data)[[2]]
print(cumSum - 1);
h = Vectorize(pf)
plot(h, 1, cumSum-1, n=cumSum-1, lwd=0.001, xlim=c(0,cumSum-1))
答案 0 :(得分:6)
正如我的评论所述,plot
command type
标志设置为s
应该可以解决问题。
例如,您首先10
样本:
x <- c(0,664,63,404,544,651,686,507,1155,664,271)
xC <- cumsum(x)
y <- c(0,1,0,1,0,1,0,1,0,1,0)
plot(xC,y,type='s')