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

Sis*_*olm 7 r

我需要在嵌套列表中获取最大变量.对于某个站号"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
Run Code Online (Sandbox Code Playgroud)

对于每个站,我需要获得bias所有成员的最大值.因为s = 3,我设法通过:

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

是否有避免在第二行的列数"4"和使用变量名的方式$biaslapply或做的更好的办法?

jor*_*ran 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.
Run Code Online (Sandbox Code Playgroud)

tmp是一个长度为3的列表,其中每个元素本身就是长度为3的列表.每个元素都是如上所示的数据帧.

将这种数据记录为单个数据帧真的要容易得多.你会注意到我首先构造它(dat)然后将它拆分两次.在这种情况下,你可以rbind再次使用这样的代码:

newDat <- do.call(rbind,lapply(tmp,function(x){do.call(rbind,x)}))
rownames(newDat) <- NULL
Run Code Online (Sandbox Code Playgroud)

在这种形式下,这些类型的计算容易:

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
Run Code Online (Sandbox Code Playgroud)


Ram*_*ath 6

这是使用重复的另一种解决方案lapply

lapply(tmp, function(x) lapply(lapply(x, '[[', 'bias'), max))
Run Code Online (Sandbox Code Playgroud)


Gre*_*now 0

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

var2 <- lapply( var1, `[`, 'bias' )
Run Code Online (Sandbox Code Playgroud)

或者

var2 <- lapply( var1, `[[`, 'bias' )
Run Code Online (Sandbox Code Playgroud)

取决于 var1 是否是一个列表。