从r中嵌套列表中第一项的总和中减去一
我有一个初始嵌套的整数向量列表(列表列表列表),其中包含随机替换某些整数的从r中嵌套列表中第一项的总和中减去一,r,R,我有一个初始嵌套的整数向量列表(列表列表列表),其中包含随机替换某些整数的NA值。在嵌套列表中,如果一个向量包含所有NA值,则需要将其拆分为两个列表(如果嵌套列表中的多个向量包含所有NAs,则需要将其拆分为多个列表)。我最终需要一个值向量,它将嵌套列表的长度加和减1,即sum(length(list[[I]]]-1,其中I是嵌套列表中的向量列表,并删除任何小于或等于0的值 到目前为止,我已经能够做到这一点,但我意识到,如果一个列表被“人工”分解为2+个列表,我只需要从嵌套列表的第一个位置减去一个
NA
值。在嵌套列表中,如果一个向量包含所有NA
值,则需要将其拆分为两个列表(如果嵌套列表中的多个向量包含所有NA
s,则需要将其拆分为多个列表)。我最终需要一个值向量,它将嵌套列表的长度加和减1,即sum(length(list[[I]]]-1
,其中I
是嵌套列表中的向量列表,并删除任何小于或等于0的值
到目前为止,我已经能够做到这一点,但我意识到,如果一个列表被“人工”分解为2+个列表,我只需要从嵌套列表的第一个位置减去一个。此外,如果嵌套列表的第一个位置是NA
,则嵌套列表中的后续列表不需要减去1
下面是一些示例代码,提供了完整嵌套列表、随机分配NA值的嵌套列表以及示例列表的最终所需总和向量的示例
#Full List
L.full<-list(list(1,3,c(0,2,0),c(0,0)),list(1,6,c(0,3,2,0,1,0),c(0,0,0,1,0,0),1,2,c(0,1),2,c(0,0)),
list(1,0),list(1,0),list(1,4,c(2,0,0,0),c(4,1),c(1,0,0,0,0),0),list(1,0))
#Nested list with "random" NAs
L.miss<-list(list(1,3,c(0,NA,0),c(0,0)),list(1,6,c(0,3,NA,0,NA,0),c(0,NA,0,1,0,0),1,NA,c(0,1),2,c(0,0)),
list(1,NA),list(1,0),list(1,NA,c(NA,0,0,0),c(NA,NA),c(1,0,0,NA,0),0),list(1,0))
#Desired final output
L.want<-c(5,11,5,1,3,5,1)
谢谢-如果这个问题对本论坛来说太具体,请告诉我,我会删除它。我想我解决了它-删除初始
L中的第一个位置要简单得多。miss
嵌套列表然后完全忽略整个“减1”:
#Delete first instance
l<-L.miss
for (i in 1:length(l)){
l[[i]][[1]]<-NULL
}
#Same code as above but for loop sums without -1
test<-lapply(lapply(seq_along(l), function(nm) {split(l[[nm]], cumsum(sapply(l[[nm]], function(x) all(is.na(x)))))}), function(lstA) lapply(lstA,function(x) Filter(function(y) !all(is.na(y)), x)))
test2<-unlist(test,recursive=FALSE)
test3<-rapply(test2,function(x) x[!is.na(x)], how="replace") #remove NAs
test4<-integer()
for (i in 1:length(test3)){
test4[i]<-sum(lengths(test3[[i]]))
}
test5<-test4[test4>0] #remove values <=0
#result
#> test5
#[1] 5 11 5 1 3 5 1
#删除第一个实例
L更具体更好,感谢您提供数据和预期结果。我不清楚您是如何获得L.want
。例如,您能否解释一下如何获得L.want[5]
I.e 3和L.miss[[5]]
?很高兴澄清-在L.full
中的第5个位置是一个包含六个向量的列表。L.miss
随机将整数替换为NA
。由于L.miss[[5]]
中的位置2
和位置4
将所有整数替换为NA
s,因此应将其“分解”为三个“列表”:[1]
,[NA,0,0,0]
,以及最后两个向量的列表,[1,0,0,NA,0]
和[0]
。由于我正在移除NA值,从第一个位置减去一个,将嵌套列表中所有列表的长度相加,并移除所有具有0值的列表,L.miss[[5]]
最终应作为'L.want'中的3
和5
作出贡献
#Delete first instance
l<-L.miss
for (i in 1:length(l)){
l[[i]][[1]]<-NULL
}
#Same code as above but for loop sums without -1
test<-lapply(lapply(seq_along(l), function(nm) {split(l[[nm]], cumsum(sapply(l[[nm]], function(x) all(is.na(x)))))}), function(lstA) lapply(lstA,function(x) Filter(function(y) !all(is.na(y)), x)))
test2<-unlist(test,recursive=FALSE)
test3<-rapply(test2,function(x) x[!is.na(x)], how="replace") #remove NAs
test4<-integer()
for (i in 1:length(test3)){
test4[i]<-sum(lengths(test3[[i]]))
}
test5<-test4[test4>0] #remove values <=0
#result
#> test5
#[1] 5 11 5 1 3 5 1