根据多个列值获取数据子集

Ril*_*n42 3 r subset

我试图根据第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])
Run Code Online (Sandbox Code Playgroud)

最终目标:

   val1   val2   val3
1  1       4       3
1  2       0       0
3  3       5       6
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

使用subset,我们基于第2和第3列创建逻辑索引.

subset(df, subset=!(val2==0|val3==0))
Run Code Online (Sandbox Code Playgroud)

因为subset参数适用于列而不适用于矩阵.我们也可以用[而不是subset.

df[!(df[,2]==0|df[,3]==0),]
Run Code Online (Sandbox Code Playgroud)

关于OP的帖子中的第二个答案

df[,c(2,3)]!=0 #returns a matrix
#      val2  val3
#[1,]  TRUE  TRUE
#[2,] FALSE FALSE
#[3,]  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

对于子行化,我们每行只需要一个逻辑索引.


另一个选项是rowSums(如果要删除第2列和第3列的0行)

 df[rowSums(df[2:3])!=0,]
Run Code Online (Sandbox Code Playgroud)

df$val3[2] <- 2
Run Code Online (Sandbox Code Playgroud)

将返回所有行,rowSums而其他方法返回行1和3.

等效选项subset&

subset(df, !(val2==0 & val3==0))
Run Code Online (Sandbox Code Playgroud)