【问题标题】:How to subset a row from list based on condition如何根据条件从列表中子集一行
【发布时间】:2014-04-14 15:42:10
【问题描述】:

我有一个data.tableoutcome,其中有一列名为hospital。和一个名为state 的列。 outcome 已经排序。现在我想从每个state 中提取第n 个hospital(如果没有第n 个则返回该状态的NA)。我尝试通过以下方式解决它。(由于这是作业,我只展示了导致错误的第三个分支)。

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

原来outcome是这样的

> data
                                               hospital state
   1:                              NYU HOSPITALS CENTER    NY
   2:                               DOYLESTOWN HOSPITAL    PA
   3:          AVERA HEART HOSPITAL OF SOUTH DAKOTA LLC    SD
   4:                 GLENDALE ADVENTIST MEDICAL CENTER    CA
   5:                                WATERBURY HOSPITAL    CT
  ---                                                        
2716:                           DESERT SPRINGS HOSPITAL    NV
2717:                   THREE RIVERS COMMUNITY HOSPITAL    OR
2718: ROBERT WOOD JOHNSON UNIVERSITY HOSPITAL AT RAHWAY    NJ
2719:                             LAREDO MEDICAL CENTER    TX
2720:                     MEDICAL CENTER SOUTH ARKANSAS    AR

第一个和第二个分支可以产生正确的结果,就像

 > 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 时,我需要传递一个名为outcome 的参数,这会阻止我使用这个名称作为rankall 函数的参数(我改用out)。我知道在 JAVA 中 this.outcome 会有所帮助,那么在 R 中怎么样。

【问题讨论】:

  • 这是来自 Coursera,R 编程课程的作业,因此请注意不要违反荣誉代码,在测试条件之前,如果将它们转换为数字等价物会有所帮助,if (num=="best" index == 1,@ 987654342@else index = as.numeric(num)
  • 抱歉,我已经隐藏了一些细节。现在这样好吗?感谢您的帮助!顺便说一句,你能解决我关于命名空间的最后一个问题吗?
  • 州 AK 的 NA 可能表明对于特定疾病 AK 没有医院覆盖它,您可以通过仅为 AK 子集结果数据来验证这一点。关于“命名”问题,默认情况下,参数是位置匹配的,因此在 rankall 函数中,rankall(outcome=outcome,... 是一个完全有效的语句
  • 其实AK中的NA是我人为改变来表示NA发生时的情况:)。由于您的帮助,“命名”现在起作用了!奇怪的是,我尝试了同样的事情,但它没有奏效。非常感谢你
  • 似乎可以对rbindlist 进行改进。我已经链接了这个问题here

标签: r data.table


【解决方案1】:

感谢 Vivek 的帮助,我现在已经弄清楚了。 首先是关于第三个分支的错误表现。如果我首先使用as.numeric(num)num 转换为数字,它将正常工作。我认为这是因为num 被视为一个字符(因为它可能具有“最佳”和“最差”的值)导致了错误。 然而,关于命名空间的第二个很奇怪。虽然在我自己的测试中表现不佳,但在 Vivek 回答我的问题后它才起作用。所以,这意味着我们可以只使用下面的代码,R 就会得到正确的结果。

rankall <- function(outcome, num = "best"){
    outcome <- readdata(outcome = outcome)

【讨论】:

    【解决方案2】:

    下面的输出是一个警告信号,结果的第一个元素只是 NA,这是一个原子,它被函数 rbindlist 强制与第二个元素“绑定”,第二个元素是列表 $AL[[1]]

    $AK
    [1] NA
    
    $AL
    $AL[[1]]
    [1] "HIGHLANDS MEDICAL CENTER"
    

    可能的解决方案:

    一种方法是在所有三种情况下都有data.framelist 输出if 条件块,例如使用data.frame,一旦num 是数字,以下应该适用于所有情况,最佳、最差和中间行。

    sapply(outcome, function(x) data.frame(state=x[num,"state"],hospital=x[num,"hospital"])
    

    对于没有匹配项的情况,医院列应该有一个 NA,请检查这是否有效

    【讨论】:

    • 它确实有效。而且我认为您的第一个解决方案更简单
    猜你喜欢
    • 2015-11-27
    • 2020-09-09
    • 2019-10-28
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2021-08-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多