2013-07-16 66 views
0

我有包含以下兩個變量列表的列表的列表中刪除重複項:[R如何從列表

> dist_sub[[1]]$zip 
[1] 901 902 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 
[26] 929 930 931 933 934 935 936 937 938 939 940 955 961 962 963 965 966 968 969 970 975 981 

> dist_sub[[1]]$hu 
[1] 4990 NA 168 13224 NA 3805 NA 6096 3884 4065 NA 16538 NA 12348 10850 NA 
[17] 9322 17728 NA 13969 24971 5413 47317 7893 NA NA NA NA NA 140 NA  4 
[33] NA NA NA NA NA 13394 8939 NA 3848 7894 2228 17775 NA NA NA 



> dist_sub[[2]]$zip 
[1] 921 934 952 956 957 958 959 960 961 962 965 966 968 969 970 971 

> dist_sub[[2]]$hu 
[1] 17728 140 4169 32550 18275 NA 22445  0 13394 8939 3848 7894 2228 17775 NA 12895 

有沒有辦法刪除重複這樣,如果郵政編碼出現在一個列表中刪除從其他名單根據具體標準?

例如:郵編00921出現在上面的兩個列表中。我只想把它保留在人數最少的住房單元(住房單元)上。在這個我想保留郵編00921在第二個名單中,因爲hu的總數是162,280在列表2中對256,803在列表1中。

任何幫助都非常感謝。

+1

您是否只有兩個子列表,或者您是否使用了更通用的解決方案? – asb

+0

我有數百個子集。所以我正在尋找一個功能來實現根據上述標準的重複數據刪除過程。 –

回答

1

下面是您的問題的模擬數據集,以便其他人也可以使用它。

dist_sub <- list(list("zip"=1:10, 
         "hu"=rnorm(10)), 
       list("zip"=8:12, 
         "hu"=rnorm(5)), 
       list("zip"=c(1, 3, 11, 7), 
         "hu"=rnorm(4)) 
       ) 

這是我能夠想出的解決方案。我意識到,循環真的做到這一點的清潔方法:

do.this <- function (x) { 
    for(k in 1:(length(x) - 1)) { 
    for (l in (k + 1):length(x)) { 
     to.remove <- which(x[[k]][["zip"]] %in% x[[l]][["zip"]]) 
     x[[k]][["zip"]] <- x[[k]][["zip"]][-to.remove] 
     x[[k]][["hu"]] <- x[[k]][["hu"]][-to.remove] 
    } 
    } 
    return(x) 
} 

的想法非常簡單:爲每一組拉鍊的我們不斷去除重複在任何一組後的元素。我們這樣做直到倒數第二組,因爲最後一組將在其之前的任何重複中沒有重複。

使用上述功能可輕鬆實現使用您擁有的標準的解決方案,即最低總和爲hu。你需要做的是通過hu和重新排序列表dist_sub像這樣:

sum_hu <- sapply(dist_sub, function (k) sum(k[["hu"]], na.rm=TRUE)) 
dist_sub <- dist_sub[order(sum_hu, decreasing=TRUE)] 

現在你有dist_sub通過sum_hu排序,這意味着每個設置來集合之前有較大的sum_hu。因此,如果設置的值爲ij(i < j)的值爲a,則應從i th元素中刪除a。這就是這個解決方案所做的。你認爲這有道理嗎?

PS:我已經調用函數do.this,因爲我通常喜歡編寫通用解決方案,雖然這是一個非常具體的問題,儘管這很有趣。

+0

既然你有數據,你會不會介意在這裏粘貼'dput'輸出供其他人試用? OP沒有提供.. – Arun

+0

我正在模擬數據集上使用它。 :D只是想明白這個主意。 – asb

+1

@Arun:我已經添加了一個模擬數據集。 – asb