R 根据两个条件删除矩阵中的行
我有一个国家向量p和一个国家矩阵Z。Z中的一些国家不包括在p中。我想要一个有两个“如果”的参数:如果p中的行名中没有国家,并且Z中也只有NA或0(即Z=0中的行和),则从Z中删除这些国家。只有当两个“如果”都适用时,才应删除它们 下面是一个数据示例。在预期输出中,应删除阿尔及利亚,因为它在向量和矩阵中都为0R 根据两个条件删除矩阵中的行,r,if-statement,matrix,R,If Statement,Matrix,我有一个国家向量p和一个国家矩阵Z。Z中的一些国家不包括在p中。我想要一个有两个“如果”的参数:如果p中的行名中没有国家,并且Z中也只有NA或0(即Z=0中的行和),则从Z中删除这些国家。只有当两个“如果”都适用时,才应删除它们 下面是一个数据示例。在预期输出中,应删除阿尔及利亚,因为它在向量和矩阵中都为0 p <- c(Afghanistan = 2769, Albania = 93893300, Algeria = 0, Argentina=4550430, Australia=0)
p <- c(Afghanistan = 2769, Albania = 93893300, Algeria = 0, Argentina=4550430, Australia=0)
p <- as.data.frame(p)
Z <- matrix(c(0,138201.333333333,0,0,0,0,1162.33333333333,0,38.3333333333333,0,0,0,0,0,0,0,300238,0,9675,0,0,93,0,0,0), nrow = 5, ncol = 5, byrow=TRUE)
dimnames(Z) = list(c("Afghanistan","Albania","Algeria", "Argentina", "Australia"),c("Afghanistan","Albania","Algeria", "Argentina", "Australia"))
p我认为您试图使用rowSums
和colSums
作为:
inds <- !(rowSums(Z) == 0 & colSums(Z) == 0 & p[, 1] == 0)
Z[inds, inds]
# Afghanistan Albania Argentina Australia
#Afghanistan 0 138201.333 0.00000 0
#Albania 0 1162.333 38.33333 0
#Argentina 0 300238.000 9675.00000 0
#Australia 0 93.000 0.00000 0
inds谢谢这两个,我添加了一个可行的示例。要在Z
的所有列中检查p
值,还是只检查一列?在Z
中是否有矩阵或数据帧?检查class(Z)
。你们共享的是一个数据框,所以我猜每一行都是一个国家?那么,您所在的国家与矢量p
有何关联?您能否解释一下,例如,p[[1L]]
?@RonakShah p将在Z的行名中进行检查,Z是一个矩阵,现在通过一个新的示例进行了说明@ekoam是的,这个新例子应该更清楚。p和Z都包括国家,因此p[[1L]]
是2769。为什么只删除阿尔及利亚?澳大利亚也有向量和矩阵中的所有0。您是否需要Z[,!(p[,1]==0和colSums(Z)==0)]
?谢谢,这在我的示例中有效,但在我的大型矩阵中,我收到一条错误消息:Z[!(行和(Z)==0和p==0),]:(下标)逻辑下标太长,因为您的数据长度(p)
和nrow(Z)
与您的示例中的长度相同?否,我的数据是:>length(p)[1]14>nrow(Z)[1]168