gpt4 book ai didi

r - 如何将函数应用于嵌套列表?

转载 作者:行者123 更新时间:2023-12-04 07:27:47 25 4
gpt4 key购买 nike

我需要获取嵌套列表中变量的最大值。对于某个站号“s”和某个成员“m”,mylist[[s]][[m]]是以下形式:

station date.time        member  bias
6019 2011-08-06 12:00 mbr003 86
6019 2011-08-06 13:00 mbr003 34

对于每个站,我需要得到最大的 bias所有成员中。对于 s = 3 ,我设法做到了:
library(plyr)
var1 <- mylist[[3]]
var2 <- lapply(var1, `[`, 4)
var3 <- laply(var2, .fun = max)
max.value <- max(var3)

有没有办法避免第二行中的列号“4”并使用变量名 $biaslapply或者更好的方法?

最佳答案

您可以使用 [带有数据框列的名称及其索引。所以foo[4]将具有与 foo["bias"] 相同的结果(假设 bias 是第四列的名称)。
$bias不是那个列的名字。 $只是 R 中的另一个函数,如 [ ,用于访问数据框列(除其他外)。

但现在我要出去走走,就你的数据结构提供一些建议。如果嵌套列表的每个元素都包含 station 的唯一组合的数据和 member ,这是您数据的简化玩具版本:

dat <- expand.grid(station = rep(1:3,each = 2),member = rep(1:3,each = 2))
dat$bias <- sample(50:100,36,replace = TRUE)

tmp <- split(dat,dat$station)
tmp <- lapply(tmp,function(x){split(x,x$member)})

> tmp
$`1`
$`1`$`1`
station member bias
1 1 1 87
2 1 1 82
7 1 1 51
8 1 1 60

$`1`$`2`
station member bias
13 1 2 64
14 1 2 100
19 1 2 68
20 1 2 74
etc.
tmp是一个长度为三的列表,其中每个元素本身就是一个长度为三的列表。每个元素都是一个数据框,如上所示。

将此类数据记录为单个数据框确实要容易得多。您会注意到我首先以这种方式构建它 ( dat ),然后将其拆分两次。在这种情况下,您可以 rbind使用这样的代码再次将它们放在一起:
newDat <- do.call(rbind,lapply(tmp,function(x){do.call(rbind,x)}))
rownames(newDat) <- NULL

在这种形式中,这些类型的计算要容易得多:
library(plyr)
#Find the max bias for each unique station+member
ddply(newDat,.(station,member),summarise, mx = max(bias))
station member mx
1 1 1 87
2 1 2 100
3 1 3 91
4 2 1 94
5 2 2 88
6 2 3 89
7 3 1 74
8 3 2 88
9 3 3 99

#Or maybe the max bias for each station across all members
ddply(newDat,.(station),summarise, mx = max(bias))
station mx
1 1 100
2 2 94
3 3 99

关于r - 如何将函数应用于嵌套列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7337360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com