【问题标题】:Selecting data.frames in a list of data.frames, based on numbers of rows, with R根据行数,使用 R 在 data.frames 列表中选择 data.frames
【发布时间】:2013-09-04 19:12:44
【问题描述】:

这是我列表中的前两个 data.frame:

lizlist <- list(structure(c(309, 356, 378, 403, 391, 423, 151, 440, 483, 
493, 504, 384, 525, 523, 522, 523, 1801, 2078, 2535, 2650, 2765, 
3247, 3764, 3826, 4490, 4974, 5106, 5279, 5764, 6372, 6879, 6983, 
1792, 2070, 2528, 2644, 2755, 3241, 3758, 3819, 4481, 4966, 5097, 
5273, 5756, 6362, 6869, 6975, 1808, 2085, 2542, 2658, 2772, 3256, 
3770, 3836, 4500, 4981, 5116, 5288, 5776, 6384, 6891, 6995), .Dim = c(16L, 
4L)), structure(c(388, 409, 460, 471, 493, 514, 537, 590, 607, 
609, 630, 629, 641, 634, 1814, 2089, 2546, 2660, 2774, 3255, 
3833, 4497, 4981, 5115, 5775, 6386, 6896, 7001, 1807, 2080, 2538, 
2653, 2766, 3245, 3825, 4489, 4973, 5106, 5765, 6374, 6885, 6991, 
1821, 2096, 2555, 2668, 2781, 3268, 3844, 4507, 4988, 5125, 5784, 
6397, 6909, 7012), .Dim = c(14L, 4L)))

我只需要根据 nrow==14 选择 data.frame,然后删除其余部分。所以在这种情况下,结果将是一个仅包含第二个 data.frame 的列表。我不明白为什么下面的 lapply 调用不起作用并且只返回我的 data.frame 的第一行并且仍然列出第一个(空)data.frame。

lapply(lizlist,function(x) x[which(nrow(x)==14),])

再次感谢您的帮助!

【问题讨论】:

    标签: r list


    【解决方案1】:

    你想要的是

    lizlist[sapply(lizlist, nrow)==14]
    

    请记住,这将返回符合条件的所有 data.frames 的list(这通常是一件好事)。如果您知道列表将仅包含一个这样的 data.frame,则可以使用 [[which

    【讨论】:

    • 太好了,是否可以保留所选列表的索引?在上面的示例中,列表索引将为 2。
    • sapply 比我要求我取消列出结果的 lapply 尝试要好。
    • 该索引可通过which(sapply(lizlist, nrow)==14) 访问。如果您真的希望保留索引,我想您可以这样做lapply(lizlist, function(x) if (nrow(x)==14) x)
    【解决方案2】:

    试试这个(在我收到有助于确定我第一次尝试失败的原因的错误消息之后)

    > lizlist[ unlist( lapply(lizlist, function(x) nrow(x) ) ) == 14]
    [[1]]
          [,1] [,2] [,3] [,4]
     [1,]  388 1814 1807 1821
     [2,]  409 2089 2080 2096
     [3,]  460 2546 2538 2555
     [4,]  471 2660 2653 2668
     [5,]  493 2774 2766 2781
     [6,]  514 3255 3245 3268
     [7,]  537 3833 3825 3844
     [8,]  590 4497 4489 4507
     [9,]  607 4981 4973 4988
    [10,]  609 5115 5106 5125
    [11,]  630 5775 5765 5784
    [12,]  629 6386 6374 6397
    [13,]  641 6896 6885 6909
    [14,]  634 7001 6991 7012
    

    您的尝试成功访问了 lizlist 中的所需元素,但它随后返回了第一行,因为 which() 函数在该元素中返回 TRUE 并且已转换为数字 1。

    要回答您对数据框索引的请求,请尝试:

    > which( sapply(lizlist,function(x) nrow(x)==14) )
    [1] 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2021-03-08
      • 2019-09-29
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多