簡體   English   中英

R如何從列表列表中刪除重復項

[英]R How to remove duplicates from a list of lists

我有一個包含以下2個變量的列表列表:

> 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在上面的兩個列表中。 我只想將其保留在hu(住房單位)總和最低的清單上。 在此我只想將郵政編碼00921保留在第二個列表中,因為hu的總和在列表2中為162,280,而列表1中為256,803。

很感謝任何形式的幫助。

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

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)
}

這個想法真的很簡單:對於每組zip,我們都會刪除其后任何一組中重復的元素。 我們這樣做直到倒數第二個集合,因為最后一個集合將不留任何重復。

使用上面的函數可以輕松地實現使用您擁有的條件的解決方案,即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)]

現在,您已按sum_hudist_sub進行排序,這意味着對於每個集合,其之前的集合具有更大的sum_hu 因此,如果在組值ij (I'j)的具有值a共同點,然后a應當從中移除i個元素。 這也是該解決方案的作用。 您認為這有意義嗎?

PS:我稱此函數為do.this因為我通常喜歡編寫通用解決方案,盡管這是一個非常具體的問題,盡管這是一個有趣的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM