sanuali0123
sanuali0123

Reputation: 133

selecting list of columns from dataframe to convert to subset

I am trying to create a function , for that at the input i am giving a list of modifying columns . for eg: sample data is


    dataa<-data.frame(
      aa = c("q","r","y","v","g","y","d","s","n","k","y","d","s","t","n","u","l","h","x","c","q","r","y","v","g","y","d","s","n","k","y","d","s","t","n","u","l","h","x","c"),
    col1=c(1,2,3,2,1,2,3,4,4,4,5,3,4,2,1,2,5,3,2,1,2,4,2,1,3,2,1,2,3,1,2,2,4,4,4,1,2,5,3,5),
    col2=c(2,1,1,7,4,1,2,7,5,7,2,6,2,2,6,3,4,3,2,5,7,5,6,4,4,6,5,6,4,1,7,3,2,7,7,2,3,7,2,4)
    )

my requirement is like , i can create any more than one cuts like below, or can be a list of cuts may be i am trying to recode my dataset

dataa$col3 <- ifelse(dataa$aa == "y",1,0)
dataa$col4 <- ifelse(dataa$col2 == 7,1,0)

so now in my function requirement i want a subset of selected variables for calculation. for eg:

#i am applying my function like this
dat1 = dataa
var1 = "col1" # variable for which calculation will be done
grouping_var = list(dataa$col3,dataa$col4)
total_var= TRUE

#fun_1 <- function(dat1,var1,grouping_var,total_var){
  total_col <- ifelse(total_var== TRUE,1,0)
  var1 <- rlang::parse_expr(var1)
  var2 <- dat1[unlist(grouping_var)] # i am trying to create a subset dataframe of selected grouping_var
  #var2 <- data.frame(sapply(grouping_var,c)) # i have tried this too
  
  dat1 <- dat1 %>% select(!!var1,!!var2) 
# so after this line i would have a subset to calculations accordingly
var_lab(dat1[[1]]) <- ""
  var_lab(dat1[[2]]) <- ""
  tab1 <- expss::cro_cpct(total(),dat1[[1]],dat1[[2]])
  tab1 <- as.data.frame(tab1)
#}
 

Upvotes: 0

Views: 82

Answers (1)

Ronak Shah
Ronak Shah

Reputation: 389265

It is not possible to select columns based on the values of the column.

An easy way would be to pass them as character vector and select. Try :

dat1 = dataa
var1 = "col1" 
grouping_var = c('col3', 'col4') #Passing columns as character vector
total_var= TRUE

#fun_1 <- function(dat1,var1,grouping_var,total_var){
total_col <- as.integer(total_var)
#total_col <- ifelse(total_var== TRUE,1,0)
dat1 <- dat1[grouping_var]
expss::var_lab(dat1[[1]]) <- ""
expss::var_lab(dat1[[2]]) <- ""
tab1 <- expss::cro_cpct(expss::total(),dat1[[1]],dat1[[2]])
tab1 <- as.data.frame(tab1)

#}

Upvotes: 1

Related Questions