2017-02-28 53 views
1

好吧,這可能是一個有點難以解釋,但掛我:合併名單列表,只保留未在R有高階列表中的元素

假設我有一個列表的列表,它由相同的元素,雖然越來越少,因爲我們中的元素分組「升級」:

level.list <- list(
list(1,2,3,4,5,6,7,8,9,10,11,12,13,14), # base level 
list(c(1,2,3),c(4,5),c(6,7),c(13,14)),  # level 2 groups 
list(c(1,2,3,6,7),c(4,5,9)),  # level 3 groups  
list(c(4,5,9,12)) # level 4 groups 
) 

因此,列表中的每個列表包含一些從該列表中的元素之前,將它們合併在更大的羣體中。

問題是,如果列表中的某個組不在列在「更高級別」列表中,那麼該組是最後一個列表。如果一個元素出現在更高級別的列表中,那麼在級別2 [6,7]合併的元素組合併到級別3的元素組[1,2,3],然後包含2級別的組[6,7]和另一個包含[1,2,3]的2級組不應該成爲最終名單的一部分,因爲兩者都存在於共享組[1,2,3,6,7]中,而這被賦予優先權。

列表元素是數據集中的索引,它將觀察結果分組在較高和較高的級別。所以實際上,這是「中途完成」列表,它創建了一個分組變量。

我根本不知道該怎麼做,找到一種方法將第一個列表與其他列表合併,從列表中刪除「低位」分組。所以我得到一個矩陣/ df,其中包含一個元素所在的「最高級別」,以及第二個數字,告訴我某個給定元素處於該級別的哪個組,因此矩陣/ df應該是這樣的:

group.matrix <- matrix(c(
1  , "3.1" , 
2  , "3.1" , 
3  , "3.1" , 
4  , "4.1" , 
5  , "4.1" , 
6  , "3.1" , 
7  , "3.1" , 
8  , "1.1" , 
9  , "4.1" , 
10 , "1.2" , 
11 , "1.3" , 
12 , "4.1" , 
13 , "2.2" , 
14 , "2.2" 
     ), 
      nrow = 14, ncol = 2, byrow = TRUE) 
colnames(group.matrix) <- c("first.level","group") 

在這裏,元素有點有序,這是不是在我的現實生活中的數據。希望我的問題對你很清楚。而且你可以幫助我!我有兩個星期的時間來交換我的masterthesis,我只是想着這個問題,但我需要解決這個問題,以便分析論文中的一些重要內容:/。

謝謝你的時間。

編輯:有關於這個問題,並相應地在玩具示例

+0

'庫(tidyverse); level.list%>%map2_df(seq_along(。),〜data.frame(x = unlist(.x),i = .y))%>%group_by(x)%>%summarize(i = max(i) )' – alistaire

+0

謝謝!我已經更新了這個問題,忘記了一些重要的東西,在MrFlicks的回答中看到我的評論(或者再次閱讀更新後的問題) 只是好奇,爲什麼不把它作爲答案? =) – emilBeBri

回答

4

下面是使用基函數

at_levels <- Map(function(i, x) cbind(i=i, x=unlist(x)), seq_along(level.list), level.list) 
aggregate(i~x, do.call("rbind", at_levels), max) 

#  x i 
# 1 1 3 
# 2 2 3 
# 3 3 3 
# 4 4 4 
# 5 5 4 
# 6 6 3 
# 7 7 3 
# 8 8 1 
# 9 9 4 
# 10 10 1 
# 11 11 1 
# 12 12 4 
# 13 13 2 
# 14 14 2 

基本上我使用Map()跟蹤出現哪一級的每個號碼(允許重複)中的溶液,然後我使用aggregate()查找每個值的最大值。如果你有幾百萬行或者某些東西,這可能不是最有效的方法,但它應該是非常直截了當的理解。

+0

@thelatemail期望的輸出幫助了很多。主要是一個幸運的猜測:) – MrFlick

+0

謝謝!我忘記了創建的分組變量還應該包含該元素所處的特定數字的重要信息。當我寫下這個問題的時候已經過了半夜,對不起。你們好棒。 – emilBeBri

+0

根本不會逼迫你,但是你認爲你知道如何做到這一點,還是僅僅因爲問題的增加而太難了?因爲,我可以手工完成最後一部分,至少在第一次將元素分類到正確的級別之後,這是可能的,然後是「子」 - 將該元素排列到該級別的列表元素中,I如果它太難以自動化,可以手動完成。謝謝! – emilBeBri

3

使用max.colmapply%in%沿另一嘗試做檢查如果一個值是在一個較高的水平的繁重的工作:

max.col(mapply(`%in%`, level.list[1], lapply(level.list, unlist)), "last") 
#[1] 3 3 3 4 4 3 3 1 4 1 1 4 2 2 
+0

謝謝!我更新了這個問題,忘記了一些重要的事情,在MrFlicks的回答中看到我的評論(或者再次閱讀更新後的問題) – emilBeBri