嗨,我有一个名为“结果”的数据框,其中有一个名为“肺炎”的栏,还有其他一些栏,例如“州”和“医院名称”
当我在命令行中运行时
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
进行硬编码,而不是将其作为参数传递,那么该函数将按预期工作。
答案 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
字段保留在数据框中。