我需要在嵌套列表中获取最大变量.对于某个站号"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"和使用变量名的方式$bias在lapply或做的更好的办法?
您可以使用[数据框列的名称及其索引.因此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.
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)
这是使用重复的另一种解决方案lapply。
lapply(tmp, function(x) lapply(lapply(x, '[[', 'bias'), max))
Run Code Online (Sandbox Code Playgroud)
您可能需要使用[[而不是[,但它应该可以与字符串一起正常工作(不要使用$)。尝试:
var2 <- lapply( var1, `[`, 'bias' )
Run Code Online (Sandbox Code Playgroud)
或者
var2 <- lapply( var1, `[[`, 'bias' )
Run Code Online (Sandbox Code Playgroud)
取决于 var1 是否是一个列表。