首页 > 解决方案 > 在 R 中对矩阵进行子集化

问题描述

我有一个捆绑矩阵,我想根据列总和(预算)和第一个值对其进行子集化。如果第一个值为 0 并且我可以添加该值并且仍然低于预算,我想删除该列。

例如,如果我的预算是 10(列总和)并且我的矩阵如下所示:

     col1     col2          col3       col4
1       2        2           0           0
2       3        3           3           3
3       0        0           2           0
4       4        0           4           0

我希望结束矩阵看起来像这样,因为 col4 第 1 行中的 0 可以包含在内,并且列总和将低于 10:

     col1     col2          col3       
1       2        2           0           
2       3        3           3           
3       0        0           2          
4       4        0           4   

我的代码目前是:

for (i in 1:ncol(df)) {
  if (df[1,i]==0) {
    df<-df[,which(colSums(df)+2>10)]
    }
  }

该代码不起作用,因为它还删除了第 2 列。我认为它在对矩阵进行子集化时没有考虑 if 语句。

谢谢。

标签: r

解决方案


一种选择是使用colSums第一行中的值创建条件以对列进行子集化。 colSums会更有效率

bids <- 2
df1[which(!(df1[1,] == 0 & (colSums(df1) + bids) < 10))]
#  col1 col2 col3
#1    2    2    0
#2    3    3    3
#3    0    0    2
#4    4    0    4

或者使用for循环

for(i in seq_along(df1)) if(df1[1, i] == 0 & sum(df1[[i]]) + bids < 10) df1[[i]] <- NULL

数据

df1 <- structure(list(col1 = c(2L, 3L, 0L, 4L), col2 = c(2L, 3L, 0L, 
0L), col3 = c(0L, 3L, 2L, 4L), col4 = c(0L, 3L, 0L, 0L)), 
class = "data.frame", row.names = c("1", 
"2", "3", "4"))

推荐阅读