Here's an easy approach:
df1[as.logical(rowSums(df1[grepl("px", names(df1))] == 456)), ]
a px1 px2 px3 b
2 b 456 222 908 123
3 c 789 333 456 333
If you want to take care of multiple values, e.g., 456
and 333
, you can use this approach:
df1[as.logical(rowSums(sapply(df1[grepl("px", names(df1))],
"%in%", c(456, 333)))), ]