R 根据两个条件删除矩阵中的行

R 根据两个条件删除矩阵中的行,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和一个国家矩阵Z。Z中的一些国家不包括在p中。我想要一个有两个“如果”的参数:如果p中的行名中没有国家,并且Z中也只有NA或0(即Z=0中的行和),则从Z中删除这些国家。只有当两个“如果”都适用时,才应删除它们

下面是一个数据示例。在预期输出中,应删除阿尔及利亚,因为它在向量和矩阵中都为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