如何在没有中间变量的情况下为变量名称的数据框的单元格赋值

时间:2018-01-23 00:33:29

标签: r

我有一个如下所示的数据框,但每次我想要执行以下操作时数据框名称都会改变:

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使用中间变量,所以我特意寻找没有中间变量的解决方案。感谢。

1 个答案:

答案 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)
}