R-在函数内部设置数据框子集时选择未定义的列

时间:2018-06-26 16:09:47

标签: r

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

当我在命令行中运行时

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

它起作用并创建带有两列“医院名称”和“肺炎”的临时数据框。

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

state是state列中的值,而result1只是列名

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进行硬编码,而不是将其作为参数传递,那么该函数将按预期工作。

3 个答案:

答案 0 :(得分:2)

我认为您需要在函数定义中的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

答案 1 :(得分:0)

很难在没有数据的情况下显示示例,但是您可以像这样将cols子集化为一个子集,这些子集可能在data.frame中也可能不在。您可以在您的subset命令之后立即在函数中添加一行。 (并且不要将cols放在子行中)

colnames( mtcars) 
# the cols you want to drop
drops <- c("mpg","colthatdoesntexisit","wt")
# drop those cols if they exisit in df
mtcars <- mtcars[ , !( names( mtcars) %in% drops ) ]
colnames( mtcars)

答案 2 :(得分:-1)

您尝试过吗?

temp <- subset(outcome, State =="NY", select=c(State, Hospital.Name, Pneumonia)

我假设您希望将State字段保留在数据框中。