复杂的嵌套列表到 R 中的干净矩阵?

complex nested list to a clean matrix in R?

为了找到一种从嵌套列表创建特定矩阵的方法,我苦苦挣扎了两天

首先,如果我没有正确解释我的问题,我深表歉意,我刚接触 Whosebug* 和 R(以及编程...)一周!

我使用了一个你可以在那里找到的文件:

使用 rjson,我有一个这样的嵌套列表: Nested list of MEP Votes

List of 23905
 $ :List of 7
  ..$ ts     : chr "2004-12-16T11:49:02"
  ..$ url    : chr "http://www.europarl.europa.eu/RegData/seance_pleniere/proces_verbal/2004/12-16/votes_nominaux/xml/P6_PV(2004)12-16(RCV)_XC.xml"
  ..$ voteid : num 7829
  ..$ title  : chr "Projet de budget général 2005 modifié - bloc 3"
  ..$ votes  :List of 3
  .. ..$ +:List of 2
  .. .. ..$ total : num 45
  .. .. ..$ groups:List of 6
  .. .. .. ..$ ALDE   :List of 1
  .. .. .. .. ..$ : Named num 4404
  .. .. .. .. .. ..- attr(*, "names")= chr "mepid"
  .. .. .. ..$ GUE/NGL:List of 25
  .. .. .. .. ..$ : Named num 28469
  .. .. .. .. .. ..- attr(*, "names")= chr "mepid"
  .. .. .. .. ..$ : Named num 4298
  .. .. .. .. .. ..- attr(*, "names")= chr "mepid"

那么我的目标是拥有这样的东西: final matrix

首先,我只想保留包含 $vote$+$groups$Renew 或 $vote$-$groups$Renew 或 $vote$ 的列表(从 [[1]] 到 [[23905]]) '0'$组$更新。主名单(23905)是记名投票。我的工作是在更新组上,所以我唯一的兴趣是在存在更新组的地方投票,以便将它们与其他组进行比较。

在那之后我的目标是创建一个像这样的矩阵所有 [[x]] 我们可以在其中找到 groups$Renewexists: final matrix

 V1             V2 (not mandatory)   V3[[x]]$voteid
[mepid==666] GUE/NGL     + (mepid==[666] is found in [[1]]$vote$+$groups$GUE/NGL)              
[mepid==777] Renew       - (mepid==[777] is found in [[1]]$vote$-$groups$GUE/NGL)             

我想创建一个矩阵,以便我可以处理每个 MEP 的投票(由他们的 MEPid 引用)。他们的投票是+(赞成)、-(反对)或0(弃权)。此外,我希望在其 mepid 旁边的列中显示 MEP 的政治团体。我们可以通过存储他们的选票的地方找到他们的政治团体。如果 mepid 显示在列表 [[x]]$vote$+$groups$GUE/NGL 中,她或他属于 GUE/NGL 组。

我想做的可能是这样的

# Clean the nested list
Keep Vote[[x]] if Vote[[x]] list contain ,
$vote$+$groups$Renew, 
or $vote$-$groups$Renew,
or $vote$'0'$groups$Renew

# Create the matrix (or a data.frame if it is easier)
VoteMatrix <- as.matrix(
V1 = all "mepid" found in the nested list
V2 = groups (name of the list where we can find the mepid) (not mandatory)
V3 to Vy = If.else(mepid is in [[x]]$vote$+ then “+”,
mepid is in [[x]]$vote$- then “-“, "0")
)

提前谢谢你,

*尽管如此,自从我开始使用 R 以来,我一直在积极阅读这个网站!

你可以看到 'votes' 子列表由三个项目组成,一个成员编号列表存储在我认为是政党代号的地方。以下是你如何“拉直”政党的积极选民 'memids':

str( unlist(  sapply(names(jlis[[1]]$votes$'+'$groups), function(x) unlist(jlis[[1]]$votes$'+'$groups[[x]]) ) ) )
 Named num [1:104] 28268 4514 28841 28314 28241 ...
 - attr(*, "names")= chr [1:104] "ALDE.mepid" "ALDE.mepid" "ALDE.mepid" "ALDE.mepid" ...

您将获得一个包含 108 个条目的命名数值向量。也许这将展示使用哪种术语来更好地描述您想要的结果。 (只为所需结果提供部分模式会留下太多歧义,无法支持完整形成的请求。)

我从您 link 下载的内容中没有看到数字 23905。我们显然正在查看不同的数据。我看到这个时间戳:chr "2004-12-01T15:20:31"。我不会因为你不了解 R 而对你有任何懈怠,因为这个任务需要用自然语言来完整解释。如果英语不是你的母语,我会在语法方面让你松懈,但你肯定需要在解释方面做出更好的努力。这是我在前三项的 votes$'+'$groups 子列表中看到的名称,但由于 RENEW 不在其中任何一项中,因此没有太多关于选择项目的证明:

> names( jlis[[1]]$votes$'+'$groups)
[1] "ALDE"    "GUE/NGL" "IND/DEM" "NI"      "PPE-DE"  "PSE"     "UEN"    
> names( jlis[[2]]$votes$'+'$groups)
[1] "GUE/NGL" "IND/DEM" "NI"      "PPE-DE" 
> names( jlis[[3]]$votes$'+'$groups)
[1] "ALDE"      "GUE/NGL"   "IND/DEM"   "NI"        "PPE-DE"    "PSE"       "UEN"       "Verts/ALE"

此外,当我使用此方法查看所有可能的投票值时(对于您提供的所有三个项目),我仍然看不到 RENEW 个名字。

sapply( jlis[[1]]$votes[c("+","-","0")], function(x) names(x$groups) )

第二次编辑后:下一步是分离那些包含“更新”值的选票。我假设可能只有三种可能的一种有“更新”值 'votes' 值(+,-.0)。如果不是(并且当其中任何一个有一个时,每个值中总是有“更新”值)那么您也许可以简化逻辑。我们制作三个逻辑向量:

 sapply( seq_along(MEPVotes)  , function(i){ 'Renew' %in% names( MEPVotes[[i]]$votes[['0']][['groups']]) } )
#[1] FALSE FALSE FALSE  TRUE
 sapply( seq_along(MEPVotes)  , function(i){ 'Renew' %in% names( MEPVotes[[i]]$votes[['+']][['groups']]) } )
#[1] FALSE FALSE FALSE  TRUE
 sapply( seq_along(MEPVotes)  , function(i){ 'Renew' %in% names( MEPVotes[[i]]$votes[['-']][['groups']]) } )
#[1] FALSE FALSE FALSE  TRUE

然后将它们包装在具有 3 列的 matrix 调用中并取每行的最大值(c(TRUE,FALSE) 的最大值为 1,然后转换回逻辑值。

selection_vec = as.logical( apply( matrix( c( 
   sapply( seq_along(MEPVotes)  , function(i){ 'Renew' %in% names( MEPVotes[[i]]$votes[['0']][['groups']]) } ),
   sapply( seq_along(MEPVotes)  , function(i){ 'Renew' %in% names( MEPVotes[[i]]$votes[['+']][['groups']]) } ),
   sapply( seq_along(MEPVotes)  , function(i){ 'Renew' %in% names( MEPVotes[[i]]$votes[['-']][['groups']]) } ) ),
                                             ncol=3 ), 1,max))

> selection_vec
[1] FALSE FALSE FALSE  TRUE