在函数内部对数据框进行子集操作时选择了未定义的列。

3
我有一个数据框,名为“outcome”,其中包含一个名为“pneumonia”的列以及其他一些列,如“State”和“Hospital.Name”。
当我在命令行中运行时,
outcome <- read.csv("Assigment3/outcome-of-care-measures.csv", colClasses = "character")
temp <- subset(outcome, State =="NY", select=c(Hospital.Name, Pneumonia)

它可以工作,并创建了一个临时数据框,其中包含2列:Hospital.Name和Pneumonia。

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

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")

我遇到了错误:

Error in [.data.frame`(x, r, vars, drop = drop) : undefined columns selected

我知道问题出在 outcome1 变量上,因为当我在上面的函数中硬编码 outcome1 而不是将其作为参数传递时,该函数按预期工作。
4个回答

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 - 很高兴能帮忙!干杯 - Luke C

0

没有数据很难举例,但是你可以像这样对可能存在于你的数据框中的列进行子集操作。在你的子集命令之后,你可以在函数中添加一行代码(然后不要在子集命令中删除列)。

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)

0

由于在搜索“r undefined columns selected”时,此帖子成为了最热门的搜索结果,因此这里提供一些可能导致错误的示例:

没有x列

mtcars[, "x" ]
# Error in `[.data.frame`(mtcars, , "x") : undefined columns selected

拼错了现有的列名 - 打字错误

colnames(mtcars)
#[1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
mtcars[, "Mpg" ]
#Error in `[.data.frame`(mtcars, , "Mpg") : undefined columns selected

按列索引进行子集,该索引不存在

ncol(mtcars)
#[1] 11
mtcars[, 12 ]
#Error in `[.data.frame`(mtcars, , 12) : undefined columns selected

-1

你试过这个吗?

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

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


这与我尝试的第一个选项相同,不使用函数“best”,我的问题是当我在函数内使用它时,状态变为变量,而列名则是另一个变量。 - Juan Lozano
1
这并不试图回答问题。问题特别是关于将outcome的值作为参数传递给函数。 - divibisan
@divibisan - 问题中没有足够的信息表明这是问题所在? - MatthewR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接