Как создать al oop для объединения нескольких наборов данных для оценки всех возможных комбинаций (два, три, несколько классов) - PullRequest
1 голос
/ 16 января 2020

Я пишу код, который обеспечивает вывод с различными матрицами в соответствии с различными классами, включенными в модель классификации, над которой я работаю. Итак, я получаю несколько наборов данных (число не определено) с одинаковыми именами столбцов (т. Е. Одинаковыми классами) и идентифицированными по фактору, указанному в столбце «фактор». Я хотел бы получить все их многочисленные комбинации, чтобы сравнить несколько классификаций и выяснить, какие из них были бы лучшими. Вот пример того, чего я хотел бы достичь (например, при оценке 3 классов, то есть 3 разных наборов данных):

frame_x = data.frame(a=c(12,10,3), b=c(6,4,2), c=c(3,62,3),factor=c("x","x","x"))
frame_y = data.frame(a=c(2,13,34), b=c(22,13,36), c=c(22,13,34),factor=c("y","y","y"))
frame_z = data.frame(a=c(36,28,11), b=c(32,24,16), c=c(33,22,17),factor=c("z","z","z"))

frame_x_new = rbind(frame_x,frame_y,frame_z)
frame_x_new$factor = c("x","x","x","other","other","other","other","other","other")
frame_y_new = rbind(frame_y,frame_x,frame_z)
frame_y_new$factor = c("y","y","y","other","other","other","other","other","other")
frame_z_new = rbind(frame_z,frame_x,frame_y)
frame_z_new$factor = c("z","z","z","other","other","other","other","other","other")

frame_x<-frame_x_new
frame_y<-frame_y_new
frame_z<-frame_z_new

Вот что я хотел бы получить в случае, если у меня есть 3 набора данных, чтобы проверить различные комбинации x против y + z, y против x + z и z против x + y. Я бы хотел использовать al oop для этого , так как у меня также может быть более высокое значение (например, 4 набора данных, где я хотел бы иметь x vs y + z + w, et c) или меньшее (например, 2 набора данных, x против y) количество фреймов данных. Кроме того, количество задействованных переменных может отличаться в зависимости от оцениваемых наборов данных. Спасибо за вашу помощь.

1 Ответ

1 голос
/ 16 января 2020

Следующая функция выполняет то, о чем спрашивает вопрос.
Она принимает 2 аргумента

  • pattern - это шаблон регулярного выражения для имен фреймов данных.
  • sep разделяет имена df и определяет суффикс.

Обратите внимание, что исходные наборы данных будут изменены.

fun <- function(pattern, sep = "_"){
  frame_list <- ls(pattern = pattern, envir = .GlobalEnv)
  suffix <- sapply(strsplit(frame_list, sep), '[[', 2)
  df_list <- mget(frame_list, envir = .GlobalEnv)
  sa <- seq_along(df_list)
  res <- lapply(sa, function(i){
    n <- nrow(df_list[[i]])
    tmp <- do.call(rbind, df_list[c(i, sa[-i])])
    tmp$factor <- c(rep(suffix[i], n),
                    rep("other", nrow(tmp) - n))
    row.names(tmp) <- NULL
    tmp
  })
  names(res) <- frame_list
  list2env(res, envir = .GlobalEnv)
}

fun("^frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...