parsing list of column names in function

I want to parse list of column of variables to a function dynamically, right now i am passing manually but I want parse dynamically .

I tried lst from dplyr but didn't work

I want to pass names of columns in lst like below and it should work .
the output should be the same as working now

lst<-lst(qq, ss)

data<-data.frame( Q1=c(1,1,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,1,1,1,NA,1,1,NA,NA,NA,NA,1,NA,NA,NA,NA,1,NA,1),
                  Q2=c(1,1,1,1,1,NA,NA,NA,NA,1,1,1,1,1,NA,NA,NA,1,1,1,NA,1,1,1,1,1,NA,NA,NA,1,1,1,1,1,1,1,NA,NA,NA),
                  Q3=c(1,1,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,1,1,1,NA,NA,NA,1,NA,NA,1,1,1,1,1,NA,NA,1),
                  Q4=c(1,NA,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
                  Q5=c(NA,1,NA,NA,1,NA,1,1,NA,NA,1,NA,1,1,NA,1,NA,1,1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,NA,1,NA,1,NA,1,NA,1,NA),
                  Q6=c(1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,1,1,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,1,1,1,1,1,1,NA,1,NA,1,1,NA,1),
                  Q7=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA),
                  Q8=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA),
                  region=c(1,2,1,1,1,2,1,2,2,1,2,NA,1,1,2,2,2,1,1,1,2,NA,2,1,1,1,2,2,2,NA,1,2,2,1,1,1,2,2,2)
)

data$Q5<-factor(data$Q5, levels=c(1), labels=c("USA"))
data$Q6<-factor(data$Q6, levels=c(1), labels=c("Worlds"))
data$region<-factor(data$region, levels=c(1,2), labels=c("ALL","Special"))


df<- data
df$qq<-1
df2<- subset(df, region == 'ALL')
df$ss<-ifelse(df$region == 'ALL',1,NA)
lst<-list(df$qq, df$ss)




split_data <- function(dataset, split_lstt) {
  if (length(split_lstt) == 1) {return(dataset)
  }else {
    lapply(split_lstt, function(x, dataset) {
      dataset[!is.na(x), ]},dataset)
  }}



df_list <- split_data(df,lst)

data<-data.frame( Q1=c(1,1,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,1,1,1,NA,1,1,NA,NA,NA,NA,1,NA,NA,NA,NA,1,NA,1),
                  Q2=c(1,1,1,1,1,NA,NA,NA,NA,1,1,1,1,1,NA,NA,NA,1,1,1,NA,1,1,1,1,1,NA,NA,NA,1,1,1,1,1,1,1,NA,NA,NA),
                  Q3=c(1,1,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,1,1,1,NA,NA,NA,1,NA,NA,1,1,1,1,1,NA,NA,1),
                  Q4=c(1,NA,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
                  Q5=c(NA,1,NA,NA,1,NA,1,1,NA,NA,1,NA,1,1,NA,1,NA,1,1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,NA,1,NA,1,NA,1,NA,1,NA),
                  Q6=c(1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,1,1,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,1,1,1,1,1,1,NA,1,NA,1,1,NA,1),
                  Q7=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA),
                  Q8=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,1,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA),
                  region=c(1,2,1,1,1,2,1,2,2,1,2,NA,1,1,2,2,2,1,1,1,2,NA,2,1,1,1,2,2,2,NA,1,2,2,1,1,1,2,2,2)
)

data$Q5<-factor(data$Q5, levels=c(1), labels=c("USA"))
data$Q6<-factor(data$Q6, levels=c(1), labels=c("Worlds"))
data$region<-factor(data$region, levels=c(1,2), labels=c("ALL","Special"))

df<- data
df$qq<-1
df2<- subset(df, region == 'ALL')
df$ss<-ifelse(df$region == 'ALL',1,NA)

library(tidyverse)

# reference with tidyselect
split_data <- df %>%
  group_by(qq, ss) %>%
  group_split()

# reference with string
split_data2 <- df %>%
  group_by_at(c("qq", "ss")) %>%
  group_split()

print(split_data)
#> <list_of<
#>   tbl_df<
#>     Q1    : double
#>     Q2    : double
#>     Q3    : double
#>     Q4    : double
#>     Q5    : factor<6b223>
#>     Q6    : factor<6e190>
#>     Q7    : double
#>     Q8    : double
#>     region: factor<4e802>
#>     qq    : double
#>     ss    : double
#>   >
#> >[2]>
#> [[1]]
#> # A tibble: 18 x 11
#>       Q1    Q2    Q3    Q4 Q5    Q6        Q7    Q8 region    qq    ss
#>    <dbl> <dbl> <dbl> <dbl> <fct> <fct>  <dbl> <dbl> <fct>  <dbl> <dbl>
#>  1     1     1     1     1 <NA>  Worlds    NA    NA ALL        1     1
#>  2    NA     1    NA    NA <NA>  Worlds     1     1 ALL        1     1
#>  3    NA     1    NA    NA <NA>  <NA>      NA    NA ALL        1     1
#>  4    NA     1    NA    NA USA   <NA>       1     1 ALL        1     1
#>  5    NA    NA    NA    NA USA   <NA>       1     1 ALL        1     1
#>  6    NA     1    NA    NA <NA>  <NA>      NA    NA ALL        1     1
#>  7    NA     1    NA    NA USA   Worlds    NA    NA ALL        1     1
#>  8    NA     1    NA    NA USA   Worlds    NA    NA ALL        1     1
#>  9     1     1    NA    NA USA   <NA>      NA    NA ALL        1     1
#> 10    NA     1    NA     1 USA   Worlds     1     1 ALL        1     1
#> 11    NA     1    NA    NA <NA>  <NA>      NA    NA ALL        1     1
#> 12     1     1     1    NA USA   Worlds     1     1 ALL        1     1
#> 13    NA     1     1    NA <NA>  <NA>      NA    NA ALL        1     1
#> 14     1     1    NA    NA <NA>  Worlds     1     1 ALL        1     1
#> 15    NA     1    NA    NA <NA>  Worlds    NA    NA ALL        1     1
#> 16    NA     1     1    NA USA   Worlds     1     1 ALL        1     1
#> 17    NA     1     1    NA <NA>  <NA>      NA    NA ALL        1     1
#> 18    NA     1     1    NA USA   Worlds    NA    NA ALL        1     1
#> 
#> [[2]]
#> # A tibble: 21 x 11
#>       Q1    Q2    Q3    Q4 Q5    Q6        Q7    Q8 region     qq    ss
#>    <dbl> <dbl> <dbl> <dbl> <fct> <fct>  <dbl> <dbl> <fct>   <dbl> <dbl>
#>  1     1     1     1    NA USA   <NA>       1     1 Special     1    NA
#>  2    NA    NA    NA    NA <NA>  Worlds    NA    NA Special     1    NA
#>  3    NA    NA     1    NA USA   <NA>       1     1 Special     1    NA
#>  4     1    NA    NA    NA <NA>  Worlds    NA    NA Special     1    NA
#>  5    NA     1    NA     1 USA   Worlds     1     1 Special     1    NA
#>  6    NA     1    NA    NA <NA>  <NA>       1     1 <NA>        1    NA
#>  7    NA    NA    NA    NA <NA>  <NA>      NA    NA Special     1    NA
#>  8    NA    NA    NA    NA USA   Worlds     1     1 Special     1    NA
#>  9    NA    NA     1    NA <NA>  Worlds     1     1 Special     1    NA
#> 10    NA    NA    NA    NA USA   Worlds     1     1 Special     1    NA
#> # ... with 11 more rows

Created on 2021-07-05 by the reprex package (v1.0.0)

I dont want to change my function , function will the same. how can i parse list of column in my function dynamically

What do you mean by parse?

i mean how can i pass the list of columns like this lst<-lst(qq, ss) or lst<-c(qq, ss) then while applying on function . this can automatically select columns names in function.

lst<-list(df$qq, df$ss)

This will successfully create a list object with two elements, each being a vector. So if you're asking how to create a list with the qq and ss columns, then you've done it.

I think there's an issue with how you're using lapply though. Maybe try this. I tried to make a guess what you're trying to do, but I'm not sure.

split_data <- function(dataset, split_lstt) {
    lapply(split_lstt, function(x) {dataset[!is.na(x), ]})
}

I mean i just want to give column names in lst like (qq,ss) and these column names will dynamically pick by function rather it be df or subset of df. so if i will have a subset of df then it should work for the same . right now i am giving like this list(df$qq, df$ss) and its picking df by default.

hope i make it clear now

lets say you have df and subdf
and you call this function we will help you write, and you call it with parametersr qq and ss
how will this function know whether you want qq and ss from df or from subdf ?
will you be passing a parameter that tells it ?

When you say "picking" do you mean indexing?

If you want to pass column names to a function you can define a character vector and then index with []

my_col <- c("qq", "ss")
df[, my_col]

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.