Функция для итеративного создания подмножеств фрейма данных - PullRequest
0 голосов
/ 12 июня 2018

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

Пример кадра данных:

df <- data.frame(var1 = rep(1:3, each = 5),
                 var2 = rep(4:6, each = 5), 
                 var3 = rep(7:9, each = 5))

Вектор столбцов для подмножества: cols.df <- c(1,2,3)

Список значений в каждом столбце для поднабора по: rows.df <- list(c(1:3), c(4:6), c(7:9))

Функция для итеративного создания списка подмножеств:

subsetfcn <- function(data, cols, rowslist){

  df <- data 
  listofdfs <- list() # create data.frame to contain subsets

  for(a in cols){
    for(rows in rowslist) {
      for(row in rows) {
        df <- df[df[ , a]==row, ]
        listofdfs[[row]] <- df
      }
    }
  }
  return(listofdfs)
}

results <- subsetfcn(df, cols.df, rows.df)

Ожидаемый вывод - это список:

> df[df[ , 1]==1, ]
  var1 var2 var3
1    1    4    7
2    1    4    7
3    1    4    7
4    1    4    7
5    1    4    7
> df[df[ , 1]==2, ]
   var1 var2 var3
6     2    5    8
7     2    5    8
8     2    5    8
9     2    5    8
10    2    5    8
> df[df[ , 1]==3, ]
   var1 var2 var3
11    3    6    9
12    3    6    9
13    3    6    9
14    3    6    9
15    3    6    9
> 
> df[df[ , 2]==4, ]
  var1 var2 var3
1    1    4    7
2    1    4    7
3    1    4    7
4    1    4    7
5    1    4    7
> df[df[ , 2]==5, ]
   var1 var2 var3
6     2    5    8
7     2    5    8
8     2    5    8
9     2    5    8
10    2    5    8
> df[df[ , 2]==6, ]
   var1 var2 var3
11    3    6    9
12    3    6    9
13    3    6    9
14    3    6    9
15    3    6    9

и т. Д.

AsНа данный момент функция возвращает список из 9 фреймов данных, но у каждого нет строк.Я не уверен, почему правильные значения не передаются a и row.

1 Ответ

0 голосов
/ 12 июня 2018

Использование mapply :

res <- unlist(
  mapply(function(cols.df, rows.df){
    lapply(rows.df, function(x){ df[ df[ , cols.df ] == x, ] })

  }, cols.df, rows.df, SIMPLIFY = FALSE),
  recursive = FALSE)


# check output
length(res)
# [1] 9

res[1:2]
# [[1]]
# var1 var2 var3
# 1    1    4    7
# 2    1    4    7
# 3    1    4    7
# 4    1    4    7
# 5    1    4    7
# 
# [[2]]
# var1 var2 var3
# 6     2    5    8
# 7     2    5    8
# 8     2    5    8
# 9     2    5    8
# 10    2    5    8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...