【问题标题】:R - Undefined columns selected when subsetting data frame inside a functionR - 在函数内对数据框进行子集化时选择了未定义的列
【发布时间】:2018-12-05 10:24:55
【问题描述】:

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

当我在命令行中运行时

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


    【解决方案1】:

    你试过了吗?

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

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

    【讨论】:

    • 这与我在不使用函数“best”的情况下尝试的第一个选项相同,我遇到的问题是当我在函数中使用它并且状态变为变量并且列名是另一个变量
    • 这并不试图回答这个问题。这个问题特别是关于将outcome 的值作为参数传递给函数。
    • @divibisan - 问题中没有足够的信息表明问题所在?
    【解决方案2】:

    很难展示没有数据的示例,但您可以像这样子集可能在或不在您的 data.frame 中的 cols。您可以在您的子集命令之后在您的函数中添加一行。 (并且不要在子集行中删除 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)
    

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

      • @JuanLozano - 乐于助人!干杯
      猜你喜欢
      • 2013-10-12
      • 1970-01-01
      • 2016-07-02
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多