Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
551 views
in Technique[技术] by (71.8m points)

r - Getting subset of of data based on multiple column values

I am trying to remove rows based on whether or not columns 2 and 3 contain 0's. I keep getting very strange results. I tried to write it without subset initially because I read somewhere that subset should only be used for small amounts of data because of the memory cost. Neither attempt worked for me however. Can someone explain what I did wrong?

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])

starting dataframe:

   val1   val2   val3
1  1       4       3
1  2       0       0
3  3       5       6

end goal:

   val1   val2   val3
1  1       4       3
3  3       5       6
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Using the subset, we create a logical index based on the 2nd and third columns.

subset(df, subset=!(val2==0|val3==0))

as subset argument works on columns and not on matrices. We can also use [ instead of subset.

df[!(df[,2]==0|df[,3]==0),]

Regarding the second answer in the OP's post

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

For subsetting rows, we need only a single logical index per each row.


Another option is rowSums (if you want to remove rows that are 0 for both column 2 and 3)

 df[rowSums(df[2:3])!=0,]

i.e.

df$val3[2] <- 2

will return all the rows with rowSums while the other methods return rows 1 and 3.

The equivalent option with subset is &

subset(df, !(val2==0 & val3==0))

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...