删除元素中任何行总和小于特定值的列表元素(在 R 中)

Remove list element where any of the row sums in the element are less than a certain value (in R)

提前为我所知道的简单道歉。尽管进行了 1000 次搜索尝试,我仍然无法找到解决方案,而且我的基本技能无法应对挑战。

我有一个由整数行组成的矩阵列表。我可以使用 (l)apply 函数等找到行总计等。然而,如果任何行不符合特定条件,我所坚持的是删除整个元素,比如总数 <500。

所以在下面的例子中:

x1 <- rnorm(50,5,0.32)
dim(x1) <- c(5,10)
x2 =rnorm(50,25,3.2)
dim(x2) <- c(5,10)
x3 =rnorm(50,25,3.2)
dim(x3) <- c(5,10)
x4=rnorm(50,0.8,0.1)
dim(x4) <- c(5,10)
x5=rep(NaN,50)
dim(x5) <- c(5,10)

list1<-list(x1,x2,x3,x4,x5)

如果我将每个元素中的每一行相加为总和:

goodbit <- lapply(list1, function (x) apply(x, 1, function(c) sum(c)))

我知道我可以用 NA 过滤掉元素:

list1nonas  <- Filter(Negate(anyNA),list1)

但我很难将其扩展到基于行总数的标准。例如,如何删除该元素中任何行总计小于 8 的任何元素。 (本例中的元素 [[4]])。

您可以使用 rowSums。如果我们想测试给定矩阵x中是否有rowSums小于8,我们可以做any(rowSums(x) < 8)。因此,如果行总和的 none 小于 8,则此逻辑否定将 return TRUE

因此,我们可以将其放入 sapply 到 运行 列表中每个矩阵的测试,以及 return 逻辑向量。

用这个向量子集我们的原始列表return是一个过滤后的列表,其中只有那些行总和不低于 8 的矩阵。

list1[sapply(list1, function(x) !any(rowSums(x) < 8))]