复杂的嵌套列表到 R 中的干净矩阵?
complex nested list to a clean matrix in R?
为了找到一种从嵌套列表创建特定矩阵的方法,我苦苦挣扎了两天
首先,如果我没有正确解释我的问题,我深表歉意,我刚接触 Whosebug* 和 R(以及编程...)一周!
我使用了一个你可以在那里找到的文件:
- 原文link:https://parltrack.org/dumps/ep_mep_activities.json.lz
- 我在这里解压缩:https://wetransfer.com/downloads/701b7ac5250f451c6cb26d29b41bd88020200808183632/bb08429ca5102e3dc277f2f44d08f82220200808183652/666973
- 前 3 个列表和最后一个(共 23905 个)从这里过去:https://pastebin.com/Kq7mjis5
使用 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
为了找到一种从嵌套列表创建特定矩阵的方法,我苦苦挣扎了两天
首先,如果我没有正确解释我的问题,我深表歉意,我刚接触 Whosebug* 和 R(以及编程...)一周!
我使用了一个你可以在那里找到的文件:
- 原文link:https://parltrack.org/dumps/ep_mep_activities.json.lz
- 我在这里解压缩:https://wetransfer.com/downloads/701b7ac5250f451c6cb26d29b41bd88020200808183632/bb08429ca5102e3dc277f2f44d08f82220200808183652/666973
- 前 3 个列表和最后一个(共 23905 个)从这里过去:https://pastebin.com/Kq7mjis5
使用 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