R 如何根据条件从列表中子集行
我有一个data.table结果,它有一个名为hospital的列。和一个名为state的列。结果已经分类了。现在我想把每个州的第n家医院子集,如果没有第n家医院,那么返回该州的NA。我试着用下面的方法来解决它。因为这是一个家庭作业,所以我只展示了导致错误的第三个分支R 如何根据条件从列表中子集行,r,data.table,R,Data.table,我有一个data.table结果,它有一个名为hospital的列。和一个名为state的列。结果已经分类了。现在我想把每个州的第n家医院子集,如果没有第n家医院,那么返回该州的NA。我试着用下面的方法来解决它。因为这是一个家庭作业,所以我只展示了导致错误的第三个分支 rankall <- function(out, num = "best"){ outcome <- readdata(outcome = out) //returns a data.table sorted
rankall <- function(out, num = "best"){
outcome <- readdata(outcome = out) //returns a data.table sorted by rate
...
outcome <- lapply(outcome, function(x) ifelse(num <= nrow(x), x[num,], c(NA,NA)))
outcome <- rbindlist(outcome)
}
第一个和第二个分支可以产生正确的结果,就像
> head (data)
hospital state
1: NA AK
2: CRESTWOOD MEDICAL CENTER AL
3: ARKANSAS HEART HOSPITAL AR
4: MAYO CLINIC HOSPITAL AZ
5: GLENDALE ADVENTIST MEDICAL CENTER CA
6: ST MARYS HOSPITAL AND MEDICAL CENTER CO
> nrow(data)
[1] 54
然而,第三个条件就是不能起作用。产生错误的原因是什么
Error in rbindlist(outcome) :
Item 1 of list input is not a data.frame, data.table or list
在调试之后,我发现条件之后的结果类似于导致最后一步错误的原因
$AK
[1] NA
$AL
$AL[[1]]
[1] "HIGHLANDS MEDICAL CENTER"
与前两个不同,前两个类似于
> head(data,2)
$AK
hospital state
1: PROVIDENCE ALASKA MEDICAL CENTER AK
$AL
hospital state
1: CRESTWOOD MEDICAL CENTER AL
所以我想知道第三个分支出了什么问题。
谁能帮帮我,非常感谢
顺便问一下,我想知道我是否可以引用一个与另一个变量同名的变量。例如,当我调用readdata时,我需要传递一个名为output的参数,这会阻止我使用这个名称作为我使用out的rankall函数的参数。我知道在JAVA中,这个结果会有帮助,那么在R中呢。谢谢你对Vivek的帮助,我现在已经知道了。 首先是关于第三分公司的mis绩效。如果我首先使用as.numericnum将num转换为一个数字,它将正常工作。我认为这是因为num被认为是一个字符,因为它可能有最好和最坏的值,这导致了错误。 第二个关于命名空间的问题很奇怪。虽然在我自己的测试中表现不好,但在Vivek回答我的问题后,它才起作用。这意味着我们可以使用下面的代码,R将得到正确的结果
rankall <- function(outcome, num = "best"){
outcome <- readdata(outcome = outcome)
下面的输出是一个警告信号,结果的第一个元素只是NA,一个原子,它被函数rbindlist强制与第二个元素“绑定”,第二个元素是列表$AL[[1]] 可能的解决办法: 一种方法是在所有三种情况下都有data.frame或list输出,如果条件阻塞,例如使用data.frame,一旦num为数值,则以下内容应适用于所有情况,最佳、最差和中间行
sapply(outcome, function(x) data.frame(state=x[num,"state"],hospital=x[num,"hospital"])
对于不匹配的病例,医院栏应该有一个NA,请检查这是否有效这是Coursera,R编程课程的作业,因此请注意不要违反荣誉代码,在测试条件之前,如果将它们转换为数值等价物,如果num==最佳索引==1,如果num==最差索引=nrowx else index=as.numericnums对此表示担忧,我已经通过隐藏一些细节进行了更改。现在可以了吗?谢谢你的帮助!顺便问一下,你能解决我最后一个关于命名空间的问题吗?AK州的NA可能表明,对于特定疾病AK没有医院覆盖,你可以通过只为AK设定结果数据来验证这一点。关于“命名”问题,默认情况下,参数是位置匹配的,因此在rankall函数中,rankalloutcome=结果,。。。是一个完全有效的语句实际上AK中的NA是我人为更改的,以指示NA发生时的情况:。由于你的帮助,“命名”现在可以工作了!奇怪的是,我尝试了同样的方法,但都没用。谢谢你,Veeeeeeeeeeeeeeeeeeeeelly,我觉得有可能会有改进。我把这个问题联系起来了,它确实有效。我认为你的第一个解决方案更简单
$AK
[1] NA
$AL
$AL[[1]]
[1] "HIGHLANDS MEDICAL CENTER"
sapply(outcome, function(x) data.frame(state=x[num,"state"],hospital=x[num,"hospital"])