以下是我列表中的两个第一个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),])
再次,非常感谢您的帮助!
答案 0 :(得分:1)
你想要的是
lizlist[sapply(lizlist, nrow)==14]
请记住,这将返回符合条件的所有data.frames list
(这通常是一件好事)。如果您知道列表中只包含一个此类data.frame,则可以使用[[
和which
。
答案 1 :(得分:1)
试试这个(在我收到有助于确定我的第一次尝试失败原因的错误消息之后)
> 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