我试图根据第2列和第3列是否包含0来删除行。我一直得到非常奇怪的结果。我最初在没有subset
的情况下尝试编写它,因为我在某处读到subset
因为内存成本而应该只用于少量数据。然而,这两项尝试都没有对我有用。有人可以解释我做错了吗?
df <- data.frame(val1=c(1,2,3), val2=c(4,0,5), val3=c(3,0,6))
subset(df,df>0,c(2,3))
data.frame(df[df[,c(2,3)]!=0])
结束目标:
val1 val2 val3
1 1 4 3
3 3 5 6
答案 0 :(得分:5)
使用subset
,我们根据第2和第3列创建逻辑索引。
subset(df, subset=!(val2==0|val3==0))
因为subset
参数适用于列而不适用于矩阵。
我们也可以使用[
代替subset
。
df[!(df[,2]==0|df[,3]==0),]
关于OP的帖子中的第二个答案
df[,c(2,3)]!=0 #returns a matrix
# val2 val3
#[1,] TRUE TRUE
#[2,] FALSE FALSE
#[3,] TRUE TRUE
对于子行化,我们每行只需要一个逻辑索引。
另一个选项是rowSums
(如果要删除第2列和第3列的0行)
df[rowSums(df[2:3])!=0,]
即。
df$val3[2] <- 2
将返回rowSums
的所有行,而其他方法返回第1行和第3行。
subset
的等效选项为&
subset(df, !(val2==0 & val3==0))