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

13

我需要获取嵌套列表中一个变量的最大值。对于某个站点编号 "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

对于每个站点,我需要获得所有成员的的最大值。对于s = 3,我通过以下方式实现了该目标:

library(plyr)
var1 <- mylist[[3]]
var2 <- lapply(var1, `[`, 4)
var3 <- laply(var2, .fun = max)
max.value <- max(var3)

有没有一种避免在第二行中使用列号"4",而是在lapply中使用变量名$bias或更好的方法?

3个回答

6
您可以使用[来访问数据框的列名和索引。因此,foo[4]foo["bias"]的结果相同(假设bias是第四列的名称)。 $bias并不是该列的名称$只是R中的另一个函数,用于访问数据框的列(以及其他内容)。
现在我要冒昧提供一些关于您的数据结构的建议。如果您的嵌套列表的每个元素包含了唯一组合的stationmember数据,那么这里是一个简化的玩具版本:
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

在这种表格中,这些计算方式要简单得多:much
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

@Sisse:这就是你之前提出的问题所暗示的内容:http://stackoverflow.com/questions/7247108/problems-splitting-data-frame-into-a-nested-list。在那里,提到使用整个数据集进行分割-应用-合并方法可能更好,具体取决于你要对数据做什么。从这个例子来看,似乎确实如此。 - Brian Diggs
如果我已经问过这个问题,我很抱歉,并感谢@joran和其他任何人的帮助。 - Sisse Camilla Lundholm

6

下面是一种使用重复的 lapply 的解决方案。

lapply(tmp, function(x) lapply(lapply(x, '[[', 'bias'), max))

0

你可能需要使用[[而不是[,但它应该能够与字符串一起正常工作(不要使用$)。 尝试:

var2 <- lapply( var1, `[`, 'bias' )

或者

var2 <- lapply( var1, `[[`, 'bias' )

根据var1是否为列表。


1
你的示例如果没有引用方括号 [[[ 将无法正常工作。 - willwest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接