简体   繁体   中英

How to apply a condition to all columns of a data frame specified in a vector in R

I want to apply a condition to different columns (specified in a vector) of a data frame.

For example if I have

trial_m <- as.data.frame(cbind(c(0,1,1), c(0, 1, 0), c(0, 1, 1), c(0, 1, 0)))
aux_v <- c("V1","V2","V3")

I would like to know where in trial_m all of the values are 1 for each of the rows.

I know I can do this:

trial_m[, aux_v[1]] == 1 & trial_m[, aux_v[2]] ==  1 & trial_m[, aux_v[3]] ==  1

But aux_v can have a different lengths, for example aux_v = c("V1") . How can I apply a condition to all columns specified in the aux_v vector without typing all the conditions as above (the condition will be the same for all of the elements of the vector, to be equal 1)?

We can use if_all

library(dplyr)
trial_m %>%
   filter(if_all(all_of(aux_v), ~ .x == 1))

-output

   V1 V2 V3 V4
1  1  1  1  1

Maybe with data.table in two steps.

library(data.table)

setDT(trial_m)

temp <- trial_m[, lapply(.SD, function(x) x == 1), .SDcols = aux_v]
temp <- rowSums(temp) == nrow(temp)

temp
[1] FALSE  TRUE FALSE

I'm not sure what your expected output would be, but to check the conditions in your sample (all values for a row == 1 across variable number of columns), you could try:

trial_m <- as.data.frame(cbind(c(0,1,1), c(0, 1, 0), c(0, 1, 1), c(0, 1, 0)))
aux_v <- c("V1","V2","V3")

apply(trial_m[aux_v], 1, function(x) all(x == 1))
#[1] FALSE  TRUE FALSE

# change to only one column
aux_v <- c("V1")
apply(trial_m[aux_v], 1, function(x) all(x == 1))
#[1] FALSE  TRUE  TRUE

If you wanted to create a column that would be included in the dataset, and name the column the variables included:

# cols 1 and 3
aux_v <- c("V1","V3")

trial_m[,paste0(paste(aux_v, collapse = "_"), "_check")] <- apply(trial_m[aux_v],1, function(x) all(x == 1))

#  V1 V2 V3 V4 V1_V3_check
#1  0  0  0  0       FALSE
#2  1  1  1  1        TRUE
#3  1  0  1  0        TRUE

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM