检查R中的嵌套列表中是否存在项

检查R中的嵌套列表中是否存在项,r,list,function,nested-lists,R,List,Function,Nested Lists,我有一个data.frame,看起来像这样(此处提供的数据:) 以及2336个列表的大型列表(数据:) 我的目标是在MEP_ID_EPG中的MEP(mepid)行中添加一个“+”、一个“-”或一个“0”,如果他投票赞成(“+”),不赞成(“-”),或其他(“0”),如果他投票反对(“0”)。 在更复杂的语言中,它应该是这样的 head(MEP_ID_EPG) mepid EPG 1 2 ... 2336 1 197701 GUE.NGL + +

我有一个data.frame,看起来像这样(此处提供的数据:)

以及2336个列表的大型列表(数据:)

我的目标是在MEP_ID_EPG中的MEP(mepid)行中添加一个“+”、一个“-”或一个“0”,如果他投票赞成(“+”),不赞成(“-”),或其他(“0”),如果他投票反对(“0”)。 在更复杂的语言中,它应该是这样的

head(MEP_ID_EPG)
   mepid     EPG      1     2  ... 2336
1 197701 GUE.NGL     +      +  ... +
2 197533 GUE.NGL     0     +   ... 0
3 197521 GUE.NGL      -     0  ... -
如果( MEP_ID_EPG$mepid位于所有投票[[x]]$vows$'+'的子列表中

然后MEP_ID_EPG$[[x]]=='+')

如果(MEP_ID_EPG$mepid在所有投票[[x]]$vows$'-'的子列表中

然后MEP_ID_EPG$[[x]]='-')

else('0')

结果应该是这样的

head(MEP_ID_EPG)
   mepid     EPG      1     2  ... 2336
1 197701 GUE.NGL     +      +  ... +
2 197533 GUE.NGL     0     +   ... 0
3 197521 GUE.NGL      -     0  ... -
现在我只能这样做

MEP_ID_EPG$mepid %in% AllVotes[[1]]$votes$'+'$groups$`GUE/NGL`[[1]]
有人能帮我吗


提前谢谢你

AllVotes是一个包含2336个元素的未命名列表,每个元素都是一个特定的投票会话。因此,我们需要在其元素上循环,例如使用
map()
,或
lappy()
,或
循环

此外,对于给定会话
i
,可以通过以下方式获得投票
+
的MEP ID:

unlist(AllVotes[[i]]$votes$`+`$groups)
对于
-
0
也一样

因为您希望每次选举都有一列输出,所以让我们创建一个空白表并填充它。我将使用一个矩阵,在这里我发现它更实用

meps2 <- matrix(NA_character_,
                nrow = nrow(meps),
                ncol=length(AllVotes),
                dimnames = list(meps$mepid,
                                as.character(1:length(AllVotes))))

for(i in 1:length(AllVotes)){
  meps2[as.character(unlist(AllVotes[[i]]$votes$`+`$groups)), i] <- "+"
  meps2[as.character(unlist(AllVotes[[i]]$votes$`-`$groups)), i] <- "-"
  meps2[as.character(unlist(AllVotes[[i]]$votes$`0`$groups)), i] <- "0"
}
最后,我们只需要组装最终的表格。行顺序相同,因此我们甚至不需要
merge
match

meps <- cbind(meps, meps2)

你的回答令人难以置信!我也解释得很好!我在R中与数据操作做了很多斗争,最终我了解了一切。我不会只是复制/粘贴!非常感谢你!祝你度过愉快的一天,一个愉快的夜晚……你今天让一个男人很开心!可悲的是,当我理解纸上的一切时,…我在
[这意味着
中有一个mepids作为.character(未列出(所有投票[[I]]$投票$+$组))
in未在行名中找到。您可以手动检查这些ID的外观以及行名的外观,以了解差异。我在回答中测试了解决方案,以便解决问题(但不是编辑中的解决方案)。这是一个愚蠢的错误!
meps2[1:10,1:10]
table(is.na(meps2))
# -> note there still are lots of NA.
# Possibly MEPs that were not present?
meps <- cbind(meps, meps2)
for(vote in AllVotes){
  voters_+ <- unlist(AllVotes[[i]]$votes$`+`$groups)
  voters_- <- unlist(AllVotes[[i]]$votes$`-`$groups)
  voters_0 <- unlist(AllVotes[[i]]$votes$`0`$groups)
  
  meps[,vote] <-ifelse(meps$mepid %in% voters_+, "+",
          ifelse(meps$mepid %in% voters_-, "-",
          ifelse(meps$mepid %in% voters_0, "0", NA)))
}