我有一个包含以下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
是否有办法删除重复项,以便根据特定条件从一个列表中显示的邮政编码从其他列表中删除?
示例:zipcode 00921出现在上面的两个列表中。我想把它保留在最低胡(住房单位)总和的名单上。在此我想将邮政编码00921保留在第二个列表中,因为列表2中胡的总和是162,280而列表1中的256,803。
非常感谢任何帮助。
答案 0 :(得分:2)
以下是您的问题的模拟数据集,以便其他人也可以使用它。
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
的最低总和。您需要做的是按照dist_sub
的总和重新排序列表hu
,如下所示:
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
。因此,如果值i
和j
(i a
应从i
元素中删除。这就是解决方案的作用。你认为这有道理吗?
PS:我调用了函数do.this
,因为我通常喜欢编写通用解决方案,而这是一个非常具体的问题,虽然是一个有趣的问题。