如何根据条件从列表中对行进行子集化

时间:2014-04-14 15:42:10

标签: r data.table

我有一个data.table outcome,其中有一个名为hospital的列。以及一个名为state的列。 outcome已经排序。现在我想要从每个hospital中对第n state进行子集化(如果不是第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

然而,第三个条件只是COULDN&#39; T做它的工作。哪会产生错误

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。

2 个答案:

答案 0 :(得分:0)

感谢Vivek的帮助,我现在已经知道了。 首先是关于第三个分支的错误表现。如果我首先使用numas.numeric(num)转换为数字,它将正常工作。我认为这是因为num被认为是一个角色(因为它有可能是“最佳”和“最差”的价值)导致了这个错误。 关于命名空间的第二个是奇怪的。虽然在我自己的测试中表现不佳,但它只是在Vivek回答我的问题之后才开始工作。所以,这意味着我们可以使用以下代码,R将为我们提供正确的结果。

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

答案 1 :(得分:0)

下面这个输出是一个警告标志,结果的第一个元素就是NA,一个被迫“绑定”的原子。第二个元素是函数$AL[[1]]

的列表rbindlist
$AK
[1] NA

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

可能的解决方案:

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

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

对于没有匹配的病例,医院专栏应该有NA,请你检查一下是否有效