从数据框列表中提取行

时间:2018-01-19 09:58:55

标签: r

我有以下列表,例如:

> res
[[1]]
   A B freq
1 11 2    1
2 11 3    1
3 13 4    1
4 42 5    1
5 51 5    3

[[2]]
   A B   C freq
1 11 2 432    1
2 11 3 432    1
3 13 4 241    1
4 42 5   2    1
5 51 5 332    3

我想为任何列表设置一个通用方法,以获得带有"(freq)>行的行列表。 (具体价值)"或具有最大频率的头行。

如果我希望行带有"(freq)> 1"或freq top2行,输出将是这样的:

> output
 [[1]]
    A B freq
   51 5    3

 [[2]]
    A B   C freq
   51 5 332    3    

我可以通过以下方式获得它,但事实并非如此,因为我可以有一个大清单:

> res[[1]][5,]
   A B freq
5 51 5    3
> res[[2]][5,]
   A B   C freq
5 51 5 332    3

如果您能提供任何帮助,我将不胜感激

我有几个好的答案。我试过了,我将在这里显示时间结果(我不确定这是正确的方法,但它可以帮助其他用户)

> system.time({
+ result=lapply(res, subset, freq > 100)
+ })
   user  system elapsed 
   0.14    0.00    0.14 
> system.time({
+ purrr::map(res, ~ .x %>% filter(freq > 100))
+ })
   user  system elapsed 
    1.7     0.0     1.7 
> system.time({
+ purrr::map(res, function(x) {
+   x[which.max(x[["freq"]]), ]
+ })
+ })
   user  system elapsed 
   0.04    0.00    0.05 
> system.time({
+ threshold <- 1
+ purrr::map(res, function(x) {
+   x[x[["freq"]] > threshold, ]
+ })
+ })
   user  system elapsed 
   0.19    0.00    0.18 

2 个答案:

答案 0 :(得分:1)

要返回包含最大频率的一行的数据框列表,请使用purrr::map

purrr::map(res, function(x) {
  x[which.max(x[["freq"]]), ]
})

同样修改内部函数以过滤freq > some_value

例如

threshold <- 1
purrr::map(res, function(x) {
  x[x[["freq"]] > threshold, ]
})

答案 1 :(得分:0)

这是我用过的清单 一个列表=(ID = C(1,2,3,4))

使用unlist来获取数据框 a1&lt; - data.frame(unlist(a [1]))