我有一个简单的问题。我有一个对象列表。每个对象都包含几个列表。在此变得过于复杂之前,让我说明一下:
x =列表
x [[1]] =某个对象
x [[2]] =另一个对象
...
x [[n]] =另一个对象
正如我所说,每个对象都有更多列表。但是我对一个特定的列表感兴趣,我们称之为“a”。
x [[1]] [[a]] =('A':1,'B':2,'C':3,...,Z:26)
抱歉类似python的语法!我真的只是学习R.无论如何,我想要做的是组合这些对象中的列表,然后取中间值。为了更清楚,我想将所有'A'元素分组,然后取中位数:
x [[1]] [[a]] [['A']],x [[2]] [[a]] [['A']],x [[3]] [[a ]] [['A']],...,x [[n]] [[a]] [['A']]
同样地,我想将所有'B','C',...,'Z'元素分组并取其中位数......
x [[1]] [[a]] [['Z']],x [[2]] [[a]] [['Z']],x [[3]] [[a ]] [['Z']],...,x [[n]] [[a]] [['Z']]
所以问题是最好的方法是什么?我花了好几个小时试图解决这个问题!如果有人可以帮助我会很棒。
如果你想知道我在做什么,基本上我有一个随机森林对象列表(x)。所以x [[1]]是第一个随机森林,x [[100]]是第100个随机森林。每个随机森林都有一个预测值列表,这些预测值存储在例如X [[1]] [[ '预测']]。每个预测列表具有与其预测值相关联的标签。我实际上要做的是计算所有100个随机森林中每个标签的中值预测值。我想有效地做到这一点。在Python中,这很容易,但在R中我不太确定。无论如何,谢谢你的帮助!我真的很感激。
答案 0 :(得分:0)
这是你可以做到的一种方式。这有点难,因为你不能使用rapply
按列表元素的名称进行子集(这令人沮丧)。但是你可以取消列表,然后对名称进行子集化,并以median
的方式进行...
# Make some reproducible data
set.seed(1)
l <- list( a = sample(10,3) , b = sample(10,3) , c = sample(10,3) )
ll <- list( l , l , l )
# Unlist - we get a named vector but all a's have unique names - e.g. a1 , a2... an
unl <- unlist(ll)
# a1 a2 a3 b1 b2 b3 c1 c2 c3 a1 a2 a3 b1 b2 b3 c1 c2 c3 a1 a2 a3 b1 b2 b3 c1 c2 c3
# 3 4 5 10 2 8 10 6 9 3 4 5 10 2 8 10 6 9 3 4 5 10 2 8 10 6 9
# Subset by those elements that contian 'a' in their name
a.unl <- unl[ grepl("a",names(unl)) ]
# a1 a2 a3 a1 a2 a3 a1 a2 a3
# 3 4 5 3 4 5 3 4 5
# Take median
median( a.unl )
# [1] 4
要遍历多个名称,请尝试此操作...
sapply( c( "a" , "b" , "c" ) , function(x) median( unl[ grepl(x,names(unl) ) ] ) )
# a b c
# 4 8 9
答案 1 :(得分:0)
你可以通过一个简单的循环为每个A,B,C,...
做到这一点x <- c()
for( i in 1:n ) x <- c( x, x[[i]][[a]][['A']] )
median(x)
答案 2 :(得分:0)
用于创建顶级列表x
的示例数据:
x <- replicate(3, list(a = as.list(setNames(sample(1:100, 26), LETTERS)),
b = runif(10)),
simplify = FALSE)
首先,从每个列表中提取a
:
a.only <- lapply(ll, `[[`, "a")
然后,要一次性计算所有A
到Z
个中位数,请执行以下操作:
do.call(mapply, c(a.only, FUN = function(...) median(unlist(list(...)))))
# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
# 55 59 41 21 93 72 65 74 51 42 87 25 60 40 13 77 35 31 92 51 57 37 87 67 29 46
如果子列表包含的项目多于您需要的项目,请说您只想在A
,C
,Z
上计算中位数,请执行以下操作:
a.slices <- lapply(a.only, `[`, c("A", "C", "Z"))
do.call(mapply, c(a.slices, FUN = function(...) median(unlist(list(...)))))
# A C Z
# 55 41 46