r - 如何从数据中子集列
问题描述
rankhospital <- function(state = factor(), outcome = factor(), num = factor()) {
#read data
caremeasures <- read.csv("D:/data science specialization/course stuff/rprogw3/outcome-of-care-measures.csv", na.strings = "NA", stringsAsFactors = FALSE)
#separate required columns
requiredOutcomes <- caremeasures[11, 17, 23]
#assign columns names
names(requiredOutcomes[3]) <- "heart attack"
names(requiredOutcomes[4]) <- "heart failure"
names(requiredOutcomes[5]) <- "pneumonia"
arrangedData <- order(requiredOutcomes[caremeasures$State == state, c(caremeasures$Hospital.Name, outcome)])
if (num == "best"){
result <- arrangedData[1, 1]
return(result)
}
else if (num == "worst"){
result <- arrangedData[nrow(arrangedData[,1]),1]
return(result)
}
else
result <- arrangedData[num, 1]
return(result)
}
此代码应该返回与给定函数的输入相对应的单个医院的名称,但我收到一条错误消息:
Error in requiredOutcomes[caremeasures$State == state, c(caremeasures$Hospital.Name, :
incorrect number of dimensions
解决方案
我没有你的数据,所以我会预测我认为导致问题的原因。
引用caremeasures[11, 17, 23]
可能没有做你需要的事情,因此它返回了你不期望的东西。试试看caremeasures[,c(11, 17, 23)]
。
我将尝试展示正在发生的事情mtcars
:
requiredOutcomes <- mtcars[1,2,3]
requiredOutcomes
# [1] 6
requiredOutcomes[1,2]
# Error in requiredOutcomes[1, 2] : incorrect number of dimensions
因为mtcars
是 a data.frame
,所以您的[
索引[.data.frame
在后台使用。这翻译成类似
# equivalent
mtcars[1, 2]
`[.data.frame`(mtcars, 1, 2)
“参数”(是的,它只是一个常规函数)是:
str(formals(`[.data.frame`))
# Dotted pair list of 4
# $ x : symbol
# $ i : symbol
# $ j : symbol
# $ drop: language if (missing(i)) TRUE else length(cols) == 1
这意味着你的11, 17, 23
论点是有效的
`[.data.frame`(requireOutcomes, 11, 17, 23)
这适用于论点
`[.data.frame`(x = requireOutcomes, i = 11, j = 17, drop = 23)
好的,这x=
是有道理的(数据)。i=
给出您的行选择 (11),并j=
给出列选择。然而,当 R 期望 a 时logical
,任何不为零的东西都会被考虑TRUE
,所以这实际上是
`[.data.frame`(x = requireOutcomes, i = 11, j = 17, drop = TRUE)
通过返回一个标量(单个值,R中长度为1的向量)完全失去了你的意图(我怀疑)。旁注:如果您使用0
or FALSE
,那么您将返回data.frame
1 行和 1 列的 a。
这是一种调试正在发生的事情的方法,以便您下次能够自己找到它。
myfunc <- function(x) {
res <- x[1,2,3]
return(res[1:3,])
}
myfunc(mtcars)
# Error in res[1:3, ] (from #3) : incorrect number of dimensions
好的,我们看到了同样的错误。我们将使用(无论您的函数名称是什么),但您可以通过将其放置在函数中的特定位置debug(myfunc)
来获得类似的结果。browser()
debug(myfunc)
myfunc(mtcars)
# debugging in: myfunc(mtcars)
# debug at #1: {
# res <- x[1, 2, 3]
# return(res[1:3, ])
# }
# Browse[2]>
我们现在在 R 的调试器中,为我们提供了步骤执行跟踪。键入n
执行n
分机;您可以使用 阅读更多命令?browser
。
n
# debug at #2: res <- x[1, 2, 3]
# Browse[2]>
n
# debug at #3: return(res[1:3, ])
# Browse[2]>
res
# [1] 6
(“debug at”显示要执行的下一行,所以我们还没有运行return(...)
。)有了这个,我们可以看到res
——我们认为应该是一个data.frame
——只是一个数字。嗯。现在回头看看代码并弄清楚发生了什么。对我来说(在这个简单的例子中),这显然x[1,2,3]
是个问题。
推荐阅读
- c# - 带有 dotNet Framework 4.6.1 和 Ninject 的 EF Core DataContext
- azure-active-directory - 我可以在哪里查看通过 Microsoft Graph beta API 创建并使用无用户身份验证发布的 GUI Azure AD 应用程序?
- javascript - 如何在输入 21 个字符后使文本框换行
- android - 如何在图库中打开文件(从 SD 卡)
- sql - 尝试在 LEFT JOINS 表之前使用 where 子句时出错
- sql - 获取 N 个唯一用户的所有条目
- python - 通过 pandas 数据框的可能优化
- jquery - Slick Carousel Slider 覆盖 Bootstrap:Flex 对齐问题
- python - 使用多项式特征时的形状错误
- javascript - 无法从我使用 Google Apps 脚本和 HTML 创建的网站创建 chrome 扩展