【发布时间】:2011-10-31 22:43:50
【问题描述】:
我想从另一个矩阵创建一个新矩阵,但只包含不包含 0 的行,我该怎么做?
【问题讨论】:
我想从另一个矩阵创建一个新矩阵,但只包含不包含 0 的行,我该怎么做?
【问题讨论】:
这是一种更加矢量化的方式。
x <- matrix(c(0,0,0,1,1,0,1,1,1,1), ncol = 2, byrow = TRUE)
x[rowSums(x==0)==0,]
【讨论】:
我发现它可以很简单地完成
x <- matrix(c(0,0,0,1,1,0,1,1,1,1), ncol = 2, byrow = TRUE)
y <- cbind (x[which(x[,1]*x[,2] >0), 1:2])
【讨论】:
x[x[,1]*x[,2] != 0, 1:2] 会这样做。但这很难推广到更大的矩阵
我只是在拼凑其他人已经给出的好建议。我喜欢将其存储为函数并泛化为除 1 之外的值(包括分类值)的能力(也使用 select 参数进行正面或负面选择):
v.omit <- function(dataframe, v = 0, select = "neg") {
switch(select,
neg = dataframe[apply(dataframe, 1, function(y) !any(y %in% (v))), ],
pos = dataframe[apply(dataframe, 1, function(y) any(y %in% (v))), ])
}
让我们试试吧。
x <- matrix(c(0,0,0,1,1,0,1,1,1,1,NA,1), ncol = 2, byrow = TRUE)
v.omit(x)
v.omit(mtcars, 0)
v.omit(mtcars, 1)
v.omit(CO2, "chilled")
v.omit(mtcars, c(4,3))
v.omit(CO2, c('Quebec', 'chilled'))
v.omit(x, select="pos")
v.omit(CO2, c('Quebec', 'chilled'), select="pos")
v.omit(x, NA)
v.omit(x, c(0, NA))
请不要像其他人在我之前回答的那样将我的答案标记为正确的答案,这只是为了延长对话。感谢您的代码和问题。
【讨论】:
我确信有更好的方法,但这里有一种方法。我们将使用apply() 和all() 函数创建一个布尔向量来索引感兴趣的矩阵。
x <- matrix(c(0,0,0,1,1,0,1,1,1,1), ncol = 2, byrow = TRUE)
x
> x
[,1] [,2]
[1,] 0 0
[2,] 0 1
[3,] 1 0
[4,] 1 1
[5,] 1 1
> x[apply(x, 1, function(y) all(y > 0)) ,]
[,1] [,2]
[1,] 1 1
[2,] 1 1
【讨论】:
x[apply(x>0,1,all),](或x[apply(x!=0,1,all),])