所以我有很多稀疏数据:
0
0
1
0
0
0
0
1
0
1
0
并希望看到以下形式的回复:
0.5
0.75
1
0
0.25
0.5
0.75
1
0.75
1
0
我可以轻松编写一个函数来执行此操作,但数据集足够大,以至于我的计算机几乎无法处理它,因此一直在R中尝试过滤命令。
b <- apply(err_mat_first, 2, rev)
rm(err_mat_first)
filter_6m = (26300:1)/26300
d6 = filter(b, filter_6m, sides = 1)
damage_mat_6m<- apply(d6, 2, rev);
不幸的是,当我这样做时,我会得到以下顺序的东西:
0.5
0.75
1
0
0.25
0.5
1 (0.75+0.25)
1.5 (1+0.5)
0.75
1
0
我需要消除那个重叠区域。我必须相信r中有一种类型的过滤器可以做到这一点,但我找不到它。有什么建议?非常感谢你。 -Rick
所以这就是我的答案。这没什么性感,但它确实起了作用。
err_mat_first<- read.csv(file="C:/thesis/WT_test_err_mat_first.csv",head=TRUE,sep=",");
ones_at<-which(err_mat_first==1,arr.in=T)
weighted_mat<-matrix(0,nrow(err_mat_first),ncol(err_mat_first),
dimnames = list(1:nrow(err_mat_first),c("toss",common_error_codes)))
vec_len<-ones_at[1,1]-1
vec_to_insert<-(1:vec_len)/vec_len
weighted_mat[(ones_at[1,1]-vec_len+1):(ones_at[1,1]),(ones_at[1,2])]<-vec_to_insert
for (n in 2:nrow(ones_at))
{if (ones_at[n,2]==ones_at[n-1,2])
{vec_len<-ones_at[n,1]-ones_at[n-1,1]}
else
{vec_len<-ones_at[n,1]-1}
vec_to_insert<-(1:vec_len)/vec_len
weighted_mat[(ones_at[n,1]-vec_len+1):(ones_at[n,1]),(ones_at[n,2])]<-vec_to_insert
}
我确信有更好的方法,但至少这种方式我只需要循环几千次而不是十亿次。