首页 > 解决方案 > R - 在函数内对数据框进行子集化时选择了未定义的列

问题描述

嗨,我有一个名为“结果”的数据框,其中有一列名为“肺炎”,还有一些其他列,如“状态”和“医院名称”

当我在命令行中运行时

outcome <- read.csv("Assigment3/outcome-of-care-measures.csv", colClasses = "character")
temp <- subset(outcome, State =="NY", select=c(Hospital.Name, Pneumonia)

它可以工作,并创建带有两列 Hospital.Name 和 Pneumonia 的临时数据框。

但是当我创建一个包含相同指令的函数时

state 是 state 列中的一个值,outcome1 只是列名

best <- function(state, outcome1) {
    outcome <- read.csv("Assigment3/outcome-of-care-measures.csv", colClasses = "character")  
    temp <- subset(outcome, State ==state, select=c(Hospital.Name, outcome1))
}

我调用这个函数:

best("NY","Pneumonia")

我得到错误:

[.data.frame`(x, r, vars, drop = drop) 中的错误:选择了未定义的列

我知道问题出在outcome1变量上,因为如果我outcome1在上面的函数中硬编码,而不是将其作为参数传递,函数会按预期工作。

标签: r

解决方案


我认为你需要get在你outcome1的函数定义中,因为你传递一个字符串而不是一个对象作为你的参数。使用此示例数据:

outcome <- data.frame(Pneumonia = sample(0:1, size = 5, replace = TRUE),
                      State = c("NY", "NY", "NY", "CA", "CA"),
                      Hospital.Name = LETTERS[1:5]
                      )

而这个修改后的功能:

best <- function(df_, state_, var_) {
  subset(df_, State == state_, select = c(Hospital.Name, get(var_)))
}          

现在您可以像以前一样或多或少地调用它:

> best(df_ = outcome, state_ = "NY", var_ = "Pneumonia")
  Hospital.Name Pneumonia
1             A         0
2             B         1
3             C         0

推荐阅读