我有一个如下所示的数据框,但每次我想要执行以下操作时数据框名称都会改变:
name <- "test"
type <- "test_type"
ACTUAL <- replicate(1,sample(0:1,1000,rep=TRUE))
assign(paste(name, type, sep = ""), cbind(data.frame(replicate(10,sample(c(NA, 0, 1),1000,rep=TRUE))), ACTUAL))
第11列中的值是正确的值,前10列是预测值(一些NA值,因为在每次迭代时都没有预测到)。我想添加另一个列,它告诉我预测模型正确的时间比例(忽略NA值,因为我没想到模型每次都会预测每个样本)。
我想做类似以下的事情,但它不起作用:
for (x in 1:nrow(get(paste(name, type, sep = "")))) {
get(paste(name, type, sep = ""))[x, "ACC"] <-
as.character(rowMeans(get(paste(name, type, sep = ""))[x,-c(which(is.na(get(
paste(name, type, sep = "")
)[x, ])),
grep("ACTUAL", colnames(get(
paste(name, type, sep = "")
))),
grep("names", colnames(get(
paste(name, type, sep = "")
))))] == get(paste(name, type, sep = ""))[x, "ACTUAL"]))
}
您能否建议如何使用变量名称将精度值分配给数据框中的新列? assign
不起作用,因为我正在为非字符值赋值。
我也无法创建一个中间变量,因为这是一个更大的函数的一部分,并且在具有共享内存的并行系统上运行该函数时,变量名称不会混淆是必不可少的。
谢谢!
编辑:我意识到我应该提到解决方案Assign to a variable data frame in R使用中间变量,所以我特意寻找没有中间变量的解决方案。感谢。答案 0 :(得分:1)
如果在函数中隔离它们,中间变量不会产生干扰。这些方面的东西怎么样?
1)计算预测模型正确的时间比例,忽略NA值。这是一个没有副作用的纯函数。
propCorrectPred <- function (df) {
correctPredictions <- lapply(df[,-ncol(df)], function(x) x == df$ACTUAL)
correctPredictions <- as.data.frame(correctPredictions)
rowMeans(correctPredictions, na.rm = T)
}
2)获取数据框的名称,并添加ACC
列,其中包含propCorrectPred
计算的比例。这是一种带有副作用的不纯函数。请注意,如果您使用sapply
而不是for
循环运行它,它将无法正常工作。
addACC <- function(df_name) {
df <- get(df_name, envir = parent.frame())
df$ACC <- propCorrectPred(df)
assign(df_name, df, envir = parent.frame())
}
3)循环名称。
for (x in paste0(name, type)) {
addACC(x)
}