пользовательская функция для разделения данных для списка переменных

#r

#r

Вопрос:

Привет, я ищу функцию, которая может разделить набор данных, когда мы передаем список векторов в качестве входных параметров. допустим, у меня есть фрейм данных, как показано ниже.

 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),
                  Q2=c(1,1,1,1,1,NA,NA,NA,NA,1,1,1,1,1,NA,NA,NA,1,1,1,NA),
                  Q3=c(1,1,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,1,NA),
                  Q4=c(1,NA,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA,NA,1,NA,1),
                  Q5=c(NA,1,NA,NA,1,NA,1,1,NA,NA,1,NA,1,1,NA,1,NA,NA,1,NA,1),
                  Q6=c(1,NA,1,NA,NA,1,NA,NA,1,NA,1,NA,1,1,NA,1,1,NA,NA,NA,1),
                  Q7=c(NA,1,1,NA,1,NA,1,1,NA,NA,1,1,NA,NA,NA,1,1,NA,1,NA,NA),
                  region=c(1,2,1,1,1,2,1,2,2,1,2,NA,1,1,2,2,2,1,1,1,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"))
  

и допустим, у меня есть список векторов, таких как

 lst <- c(total,Q6,Q5,.....)
  

Функция создаст список подмножеств фреймов данных для lst

если у lst есть total, то целые данные (исходные данные) для Q6 фильтруют все значения, отличные от NA, а затем создают целое подмножество для Q6 для Q5 фильтруют все значения, отличные от NA, а затем создают целое подмножество для Q5

входной параметр для функции будет иметь вид

 split_data(dataset= data, list_d= lst)
  

для этого требуется вывод списка фреймов данных

данные <- данные

 Q6 <- data %>% filter(Q6==1)
Q5 <- data %>% filter(Q5==1)
lstt <- list(total,V8,Q5)
lstt
  

Комментарии:

1. Каков ваш список векторов (т. Е. Это lst <- c(total,Q6,Q5,.....) )? Это просто символьный вектор, подобный c("total", "Q6", "Q5") ?

2. да, это символьный вектор,

Ответ №1:

Это то, что вы хотите?

 split_data <- function(df, lst) {
  lapply(lst, function(x, df) {
    if (x == "total")
      return(df)
    df[!is.na(df[[x]]), ]
  }, df)
}
  

Вывод

 > split_data(data, c("total", "Q5", "Q6"))
[[1]]
   Q1 Q2 Q3 Q4 Q5 Q6 Q7 region
1   1  1  1  1 NA  1 NA      1
2   1  1  1 NA  1 NA  1      2
3  NA  1 NA NA NA  1  1      1
4  NA  1 NA NA NA NA NA      1
5  NA  1 NA NA  1 NA  1      1
6  NA NA NA NA NA  1 NA      2
7  NA NA NA NA  1 NA  1      1
8  NA NA  1 NA  1 NA  1      2
9   1 NA NA NA NA  1 NA      2
10 NA  1 NA NA NA NA NA      1
11 NA  1 NA  1  1  1  1      2
12 NA  1 NA NA NA NA  1     NA
13 NA  1 NA NA  1  1 NA      1
14 NA  1 NA NA  1  1 NA      1
15 NA NA NA NA NA NA NA      2
16 NA NA NA NA  1  1  1      2
17 NA NA  1 NA NA  1  1      2
18  1  1 NA NA NA NA NA      1
19 NA  1 NA  1  1 NA  1      1
20 NA  1  1 NA NA NA NA      1
21 NA NA NA  1  1  1 NA      2

[[2]]
   Q1 Q2 Q3 Q4 Q5 Q6 Q7 region
2   1  1  1 NA  1 NA  1      2
5  NA  1 NA NA  1 NA  1      1
7  NA NA NA NA  1 NA  1      1
8  NA NA  1 NA  1 NA  1      2
11 NA  1 NA  1  1  1  1      2
13 NA  1 NA NA  1  1 NA      1
14 NA  1 NA NA  1  1 NA      1
16 NA NA NA NA  1  1  1      2
19 NA  1 NA  1  1 NA  1      1
21 NA NA NA  1  1  1 NA      2

[[3]]
   Q1 Q2 Q3 Q4 Q5 Q6 Q7 region
1   1  1  1  1 NA  1 NA      1
3  NA  1 NA NA NA  1  1      1
6  NA NA NA NA NA  1 NA      2
9   1 NA NA NA NA  1 NA      2
11 NA  1 NA  1  1  1  1      2
13 NA  1 NA NA  1  1 NA      1
14 NA  1 NA NA  1  1 NA      1
16 NA NA NA NA  1  1  1      2
17 NA NA  1 NA NA  1  1      2
21 NA NA NA  1  1  1 NA      2