根据@Andy之前回答的问题,我希望使用Jenks自然间断为每个地图提供不同的分类间隔。为此,我使用了库classInt
,它适用于单个绘图。然而,我不知道如何在@Andy的lapply
解决方案中实现每列(或映射)不同的分类。这可能很容易。因此,使用我上一个问题的样本数据,我会创建这样的分类区间(基于spdf
对象):
library(classInt)
# create classification intervalls for single columsn
classInt_Bv <- classIntervals( spdf$BLUE.veggies, n=3, style="jenks")
Bv = classInt_Bv$brks
classInt_Bf <- classIntervals( spdf$BLUE.fruits, n=3, style="jenks")
Bf = classInt_Bf$brks
classInt_Bn <- classIntervals( spdf$BLUE.nuts, n=3, style="jenks")
Bn = classInt_Bn$brks
classInt_Gv <- classIntervals( spdf$GREEN.veggies, n=3, style="jenks")
Gv = classInt_Gv$brks
classInt_Gf <- classIntervals( spdf$GREEN.fruits, n=3, style="jenks")
Gf = classInt_Gf$brks
classInt_Gn <- classIntervals( spdf$GREEN.nuts, n=3, style="jenks")
Gn = classInt_Gn$brks
# merge all cols again together
catMethod = data.frame(Bv,Bf,Bn,Gv,Gf,Gn)
在这里,也许我的第一个问题是有更简单/更快的方法吗?正如我在第二个df中使用的50多个cols。
我的第二个(也是主要的)问题是:如何将这些分类区间实现到@Andy的lapply函数中,以便每个地图都使用wright分类区间?感谢
来自链接中提供的示例
spdf <- df
由于存在非数字列,我们可以为那些名称为"BLUE"或"GREEN"且带有grep
('i1')的列的数据集子集,然后循环这些列,应用classIntervals
函数并获得list
中的"brks"。
i1 <- grep('^(BLUE|GREEN)', names(spdf))
lst <- lapply(spdf[i1], function(x) classIntervals(x, n=3,
style='jenks')$brks)
names(lst) <- sub('^(.)[^.]+.(.).*', '\1\2', names(lst))
res <- data.frame(lst)
res
# Bf Bn Bv Gf Gn Gv
#1 0 0 0 0 0 0
#2 3745797 171984 34910 3389314 464688 15508
#3 12803543 533665 92690 8942278 1640804 149581
#4 19947613 21563867 188940 15773576 6399474 174504