我有一个不同范围原始输入的数据集。我希望将它们作为列表存储在R中。数据是4维的。
我创建了一个for循环来将数据存储在嵌套列表中,但数据似乎只属于最后一个列表。我似乎无法找到循环问题。
我有两个不同的清单。在其中一个中,我将数据堆叠在一起,工作正常,所以我似乎没有数据采集的问题。对于嵌套循环,它会跳过列表的第一层并正确存储最后获取的数据。我附上了代码,我很感激任何帮助。感谢。
mask1 = list()
mask2 = list()
mask3 = list()
mask4 = list()
mask5 = list()
mask1$vid = list()
mask2$vid = list()
mask3$vid = list()
mask4$vid = list()
mask5$vid = list()
mask1$all = list()
mask2$all = list()
mask3$all = list()
mask4$all = list()
mask5$all = list()
for (i in 1:6766){
f <- i%%199
v <- ceiling(i/199)
if (f==0){
f=199;
}
mask1$vid[[v]] = list()
mask2$vid[[v]] = list()
mask3$vid[[v]] = list()
mask4$vid[[v]] = list()
mask5$vid[[v]] = list()
mask1$vid[[v]][[f]] = list()
mask2$vid[[v]][[f]] = list()
mask3$vid[[v]][[f]] = list()
mask4$vid[[v]][[f]] = list()
mask5$vid[[v]][[f]] = list()
data1 = read.table(mask1_dir[i])
data2 = read.table(mask2_dir[i])
data3 = read.table(mask3_dir[i])
data4 = read.table(mask4_dir[i])
data5 = read.table(mask5_dir[i])
data1=t(data1)
data2=t(data2)
data3=t(data3)
data4=t(data4)
data5=t(data5)
for (j in 1:8) {
m1 <- data1[,j]
m2 <- data2[,j]
m3 <- data3[,j]
m4 <- data4[,j]
m5 <- data5[,j]
m1<-m1[m1>0]
m2<-m2[m2>0]
m3<-m3[m3>0]
m4<-m4[m4>0]
m5<-m5[m5>0]
mask1$vid[[v]][[f]][[j]] = t(data.frame(m1))
mask2$vid[[v]][[f]][[j]] = t(data.frame(m2))
mask3$vid[[v]][[f]][[j]] = t(data.frame(m3))
mask4$vid[[v]][[f]][[j]] = t(data.frame(m4))
mask5$vid[[v]][[f]][[j]] = t(data.frame(m5))
mask1$vid[[v]][[f]][[j]]
if (v==1 & f==1){
mask1$all[[j]] = t(data.frame(m1))
mask2$all[[j]] = t(data.frame(m2))
mask3$all[[j]] = t(data.frame(m3))
mask4$all[[j]] = t(data.frame(m4))
mask5$all[[j]] = t(data.frame(m5))
}
else{
for (k in 1:length(m1)){
mask1$all[[j]][(length(mask1$all[[j]])+1)] = m1[k]}
for (k in 1:length(m2)){
mask2$all[[j]][(length(mask2$all[[j]])+1)] = m2[k]}
for (k in 1:length(m3)){
mask3$all[[j]][(length(mask3$all[[j]])+1)] = m3[k]}
for (k in 1:length(m4)){
mask4$all[[j]][(length(mask4$all[[j]])+1)] = m4[k]}
for (k in 1:length(m5)){
mask5$all[[j]][(length(mask5$all[[j]])+1)] = m5[k]}
}
}
}
答案 0 :(得分:2)
你遇到的主要问题是当你在1:6766中查看我时,你将所有列表元素重新初始化为空列表()s(即mask1 $ vid [[v]] = list()将清除早期循环中[[v]]索引中的任何内容)。所以你需要将初始化与累积分开。你还有很多冗余代码。
这是一种可能的替代方案,它使用1个MASK的列表,并使用3-D列表数组进行vid而不是列表列表。
M<-5
F<-199
V<-34
J<-8
#full initialization
mask <- lapply(1:M, function(x) {
list(
vid=array(list(NULL),dim=c(V,F,J)),
all=lapply(1:J, function(x) numeric(0)))
})
mask_dir<-list(m1=character(F*V), m2=character(F*V), m3=character(F*V), m4=character(F*V),m5=character(F*V))
read.table.fake<-function(...) {return(data.frame(matrix(rep(1:3, each=J), nrow=J, ncol=3)))}
for(f in 1:F) {
for(v in 1:V) {
i<- f + (v-1)*199
data<-lapply(1:M, function(x) t(read.table.fake(mask_dir[[x]][i], i)))
for(j in 1:J) {
ppdata <- lapply(1:M, function(x) Filter(function(z) {z>0}, data[[x]][,j]))
for(m in 1:M) {
mask[[m]]$vid[[v,f,j]] <- ppdata[[m]]
mask[[m]]$all[[j]] <- c(mask[[m]]$all[[j]], ppdata[[m]])
}
}
}
}
我已经包含了一个假的read.table,因为你真的没有说明你的数据实际上是什么样的。我假设每个文件必须有8行,可能是可变数量的列,所有值都是数字?我还将mask_dir变量组合到一个列表中,使mask_dir=list(mask1_dir, mask2_dir, mask3_dir, mask4_dir, mask5_dir)
所以代码更短但运行起来需要一段时间,因为这需要大量的循环和文件读取。
要获取元素,您可以使用mask[[5]]$vid[[3,1,2]]
而不是mask5$vid[[3]][[1]][[2]]
和mask[[2]]$all[[3]]
而不是mask2$all[[3]]
。
为了测试,我从小F和V值开始,只是为了确保事情看起来很好。