【问题标题】:How to assign value to cell of data frame with variable name without intermediate variable如何在没有中间变量的情况下为具有变量名的数据框单元格赋值
【发布时间】:2018-01-23 09:30:05
【问题描述】:

我有一个像下面这样的数据框,但是每次我想做以下操作时数据框名称都会改变:

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

【问题讨论】:

    标签: r


    【解决方案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)
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多