如何创建一个循环来合并多个数据集以评估所有可能的组合(二、三、多 class)
How to create a loop for merging several datasets for the evaluation of all the possible combinations (two-, three-, multi-class)
我正在编写一个代码,根据我正在处理的分类模型中涉及的不同 类 提供不同矩阵的输出。因此,我获得了一堆数据集(数字未定义),它们具有相同的列名(即相同的 类),并由 "factor" 列中报告的因子标识。我想获得它们的所有多个组合,以便比较多个分类并找出哪个是最好的。这里报告了一个我想要实现的示例(例如,在评估 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 vs y+z、y vs x+z 和 z vs x+y 的不同组合。
我想使用一个循环来执行此操作 因为我可能还有更高的(例如 4 个数据集,我希望其中有 x vs y+z+w 等) 或更少(例如 2 个数据集,x 与 y)的数据帧数。此外,根据所评估的数据集,涉及的变量数量可能会有所不同。
感谢您的帮助。
下面的函数完成了问题的要求。
它需要 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")
我正在编写一个代码,根据我正在处理的分类模型中涉及的不同 类 提供不同矩阵的输出。因此,我获得了一堆数据集(数字未定义),它们具有相同的列名(即相同的 类),并由 "factor" 列中报告的因子标识。我想获得它们的所有多个组合,以便比较多个分类并找出哪个是最好的。这里报告了一个我想要实现的示例(例如,在评估 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 vs y+z、y vs x+z 和 z vs x+y 的不同组合。 我想使用一个循环来执行此操作 因为我可能还有更高的(例如 4 个数据集,我希望其中有 x vs y+z+w 等) 或更少(例如 2 个数据集,x 与 y)的数据帧数。此外,根据所评估的数据集,涉及的变量数量可能会有所不同。 感谢您的帮助。
下面的函数完成了问题的要求。
它需要 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")