我有以下列表,例如:
> 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
答案 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]))