我需要在嵌套列表中获取变量的最大值。对于某个站号“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”并在$bias
中使用变量名lapply
或更好的方法?
答案 0 :(得分:6)
您可以将[
与数据框列的名称及其索引一起使用。因此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
是长度为3的列表,其中每个元素本身都是长度为3的列表。每个元素都是一个数据框,如上所示。
将这种数据记录为单个数据帧真的要容易得多。你会注意到我先用这种方式构造它(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
答案 1 :(得分:1)
您可能需要使用[[
而不是[
,但它应该可以正常使用字符串(不要使用$
)。尝试:
var2 <- lapply( var1, [, 'bias' )
或
var2 <- lapply( var1, [[, 'bias' )
取决于var1是否为列表。
答案 2 :(得分:1)
以下是使用重复lapply
的另一种解决方案。
lapply(tmp, function(x) lapply(lapply(x, '[[', 'bias'), max))