小编Chr*_*ris的帖子

使用ggplot绘制多个geom_point组周围的轮廓线

我好像有下面的代码来绘制这个: 在此输入图像描述

我想要做的是让每个小组的大纲遵循每个小组中的所有要点 - 而不是像目前那样跳过其中的一些.另外我希望每个轮廓都有一个半透明的填充.谢谢你的帮助.

library(ggplot2)
library(reshape)
library(car)

G1 <- 1:10
G2 <- 11:20
G3 <- 21:30
G4 <- 31:35
G5 <- 36:41

sdata <- read.csv("http://dl.dropbox.com/u/58164604/sdata.csv", stringsAsFactors = FALSE)
pdata<-melt(sdata, id.vars="Var")

VarArea <- data.frame(unique(pdata$Var))
VarFinalMin <-c()
for (g in 1:max(VarArea))
{
VarNum<-pdata[which(pdata$Var==g),1:c(ncol(pdata))]
VarN <- g
VarMin <- min(VarNum$value)
VarMinN <- cbind(VarN, VarMin)
VarFinalMin <- rbind(VarFinalMin,VarMinN) 
}
VFinalMin <- data.frame(VarFinalMin)
colnames(VFinalMin)<-c("Variable", "Value")

VarFinalMax <-c()
for (g in 1:max(VarArea))
{
VarNum<-pdata[which(pdata$Var==g),1:c(ncol(pdata))]
VarN <- g
VarMax <- max(VarNum$value)
VarMaxN <- cbind(VarN, VarMax)
VarFinalMax <- …
Run Code Online (Sandbox Code Playgroud)

r polygon ggplot2

13
推荐指数
1
解决办法
1343
查看次数

使用R将字段添加到在线表单并刮取生成的javascript创建表

我试图让R在这个网页http://cti.voa.gov.uk/cti/上用预定义的文本(例如BN1 1NA)完成"通过邮政编码搜索"字段,前进到下一页并抓取结果4列表,根据邮政编码,可以在多个页面上.为了使其更复杂,"改进指标"不是文本字段,而是图像文件(如果使用邮政编码BN1 3HP进行搜索,则会看到).我希望此列包含0或1,具体取决于图像是否存在.

最终,我追随一个很好的数据框架,它反映了屏幕上的4列.

我试图修改这个问题的建议去做我上面描述的没有运气的事情,说实话我试图破译这个问题.

我意识到R可能不是最适合我需要做的事情,但这些都是我可以使用的.任何帮助将不胜感激.

javascript r web-scraping phantomjs rselenium

13
推荐指数
1
解决办法
902
查看次数

随机将人分配到不同大小的组和类别

我需要将人们随机分配到组和类别中.不幸的是,我真的不知道从哪里开始.我试图用下面的例子来解释我的问题.任何有关这方面的帮助将非常感激.

我有207 '家庭类型A'和408 '家庭类型B'类别.总共有1524人需要被分配到207家庭类型A或408家庭类型B的类别.然而,对于家庭类型A ,1524人也需要组合在2到7组中,或者对于家庭类型B ,需要组合在2到6组中.

最终结果应该是1524人分配到207组(包含2至7人)和408组(包含2至6人).

对组的分配必须是随机的,并且可以使用所需的组大小的任意组合,因为如果不使用组类别则无关紧要(例如,如果归属类型A的207组仅包含2,3,则会没有问题.或一次4人,或另外5人和7人).

我想象一个看起来像这样的输出:

GroupSize <- c(2:7)
Num.Groups <- 0
Num.People <- 0
HouseTypeA <- data.frame(GroupSize, Num.Groups, Num.People)
GroupSize <- c(2:6)
HouseTypeB <- data.frame(GroupSize, Num.Groups, Num.People)
Run Code Online (Sandbox Code Playgroud)

将'Num.Groups'列汇总为207或408,两个数据帧之间的'Num.People'之和为1524.

r

7
推荐指数
1
解决办法
591
查看次数

随机将值分配到满足多个标准的不同大小组的数据帧/矩阵中

这是之前提出的问题的后续问题,但增加了一层额外的复杂性,因此是一个新问题.

我有两组(下面的例子中有39380).我需要做的是将889人分配到由2至7人组成的39组中,以及由2至6人组成的380组.

但是,对某些组中的人员总数有限制.在下面的示例中,每行允许的最大值在X6列中.

使用以下示例.如果在第2行中,在第X2列分配了6个人,在第X4列分配了120个人,那么总人数将是18(6*3)+240(120*2)= 258,所以这样就可以了.不满324岁.

因此,对于每一行,我所追求的是X1*X2 + X3*X4(使列X5)的值小于或等于X6,其中X2的总和为39,X4的总和为380和总和的X5是889.理想的情况下任何的解决办法是尽可能随机的(所以如果重复你会得到如果可能不同的解决方案),当值是889,39和380不同,将工作和一个.

谢谢!

DF <- data.frame(matrix(0, nrow = 7, ncol = 6))
DF[,1] <- c(2:7,"Sum")
DF[7,2] <- 39
DF[2:6,3] <- 2:6
DF[7,4] <- 380
DF[7,5] <- 889
DF[1:6,6] <- c(359, 324, 134, 31, 5, 2)
DF[1,3:4] <- NA
DF[7,3] <- NA
DF[7,6] <- NA
Run Code Online (Sandbox Code Playgroud)

编辑

我的问题的措辞可能不是最清楚的.以下是我目前使用的代码示例以及它不符合我上面设置的条件

homeType=rep(c("a", "b"), times=c(39, 380))
H <- vector(mode="list", length(homeType))
for(i in seq(H)){
  H[[i]]$type <- homeType[i]
  H[[i]]$n <- …
Run Code Online (Sandbox Code Playgroud)

r

6
推荐指数
1
解决办法
415
查看次数

使用 R 进行 1 亿个点的空间连接

我有一个包含 1 亿个点的数据集。我需要在空间上将它们连接到它们相交的区域。我正在使用sfand st_join,但毫不奇怪,当我尝试执行此操作时,我的机器内存不足。

为了解决这个问题,我将数据分割成更易于管理的大小,并循环遍历它们以获得我想要的结果。然而,我想看看是否有更聪明的方法来实现我的最终目标(将区域 ID 附加到我的原始数据中)。

require("data.table")
require("dplyr")
require("sf")

DT <- data.table(X=runif(100000000, min=300000, max=500000),
                 Y=runif(100000000, min=200000, max=400000),
                 UID = 1:100000000,
                 Group = rep(1:50, each=100000000/50))
                             
Polygon <- st_read("https://ons-inspire.esriuk.com/arcgis/services/Administrative_Boundaries/Regions_December_2019_Boundaries_EN_BFE/MapServer/WFSServer?request=GetCapabilities&service=WFS") %>%
        select(-gml_id) %>%
        st_cast(., "GEOMETRYCOLLECTION") %>%
        st_collection_extract(., "POLYGON") %>% 
        group_by(across(1:(ncol(.)-1))) %>%
        summarise() %>%
        st_cast("MULTIPOLYGON") %>%
        ungroup()

DT_Split <- split(DT, by=c("Group"))

DT_Joined <- data.table()
    for (i in 1:length(DT_Split)){
    DT_Join <- st_join(st_as_sf(DT_Split[[i]], coords = c("X","Y"),crs=27700), Polygon, join = st_intersects)
    DT_Split_Join <- DT_Join %>% st_drop_geometry %>% as.data.table
    DT_Joined <- rbindlist(list(DT_Joined, DT_Split_Join))
    }
Run Code Online (Sandbox Code Playgroud)

r spatial data.table r-sf

6
推荐指数
0
解决办法
479
查看次数

计算多个多边形之间共享边界的长度

我有一个shapefile,我想知道每个多边形有什么其他多边形触摸它.为此,我有这个代码:

require("rgdal")  
require("rgeos")

download.file("https://www.dropbox.com/s/vbxx9dic34qwz63/Polygons.zip?dl=1", "Polygons.zip")

Shapefile <- readOGR(".","Polygons")

Touching_List <- gTouches(Shapefile, byid = TRUE, returnDense=FALSE)

Touching_DF <- setNames(stack(lapply(Touching_List, as.character)), c("TOUCHING", "ORIGIN"))
Run Code Online (Sandbox Code Playgroud)

我现在想进一步了解每个多边形触及其他多边形的程度.对于每一行,我所追求的Touching_DF是每个ORIGIN多边形的总长度/周长以及每个TOUCHING多边形接触原点多边形的总长度.然后,这将允许计算共享边界的百分比.我可以想象这将是3个新列的输出Touching_DF(例如,对于第一行,它可能是原点参数1000m,触摸长度500m,共享边界50%).谢谢.

编辑1

我已将@ StatnMap的答案应用于我的真实数据集.gTouches如果多边形共享边和点,则看起来返回结果.这些点导致问题,因为它们没有长度.我已经修改了StatnMap的代码部分来处理它,但是当在最后创建数据框时,gTouches返回的共享边/顶点的数量与有多少边有长度之间存在不匹配.

下面是一些使用我的实际数据集示例来演示问题的代码:

library(rgdal)  
library(rgeos)
library(sp)
library(raster)

download.file("https://www.dropbox.com/s/hsnrdfthut6klqn/Sample.zip?dl=1", "Sample.zip")

unzip("Sample.zip")
Shapefile <- readOGR(".","Sample")

Touching_List <- gTouches(Shapefile, byid = TRUE, returnDense=FALSE)

# ---- Calculate perimeters of all polygons ----
perimeters <- sp::SpatialLinesLengths(as(Shapefile, "SpatialLines"))

# ---- All in a lapply loop ----
all.length.list <- lapply(1:length(Touching_List), function(from) {
  lines <- …
Run Code Online (Sandbox Code Playgroud)

gis r polygon shapefile

4
推荐指数
1
解决办法
1523
查看次数

使用不同列名的另一个 data.table 过滤 data.table

我有这个数据集:

library(data.table)    
dt <- data.table(
  record=c(1:20),
  area=rep(LETTERS[1:4], c(4, 6, 3, 7)), 
  score=c(1,1:3,2:3,1,1,1,2,2,1,2,1,1,1,1,1:3),
  cluster=c("X", "Y", "Z")[c(1,1:3,3,2,1,1:3,1,1:3,3,3,3,1:3)]
)
Run Code Online (Sandbox Code Playgroud)

我已经使用这篇文章中的解决方案来创建此摘要:

dt_summary = 
  dt[ , .N, keyby = .(area, score, cluster)
      ][ , {
        idx = frank(-N, ties.method = 'min') == 1
        NN = sum(N)
        .(
          cluster_mode = cluster[idx],
          cluster_pct = 100*N[idx]/NN,
          cluster_freq = N[idx],
          record_freq = NN
        )
      }, by = .(area, score)]
dt_score_1 <- dt_summary[score == 1]
setnames(dt_score_1, "area", "zone")
Run Code Online (Sandbox Code Playgroud)

我想使用结果dt_score_1dt根据区域/区域和集群/集群模式进行过滤。所以在一个新的 data.table 中,从dt区域 A 中提取的唯一行应该属于集群 X,对于区域 …

r subset filter data.table

3
推荐指数
1
解决办法
1326
查看次数

按条件子集data.table但保留属于组的所有行

我的数据看起来像这样:

require("data.table")
dt1 <- data.table(
  code=c("A001", "A001","A001","A002","A002","A002","A002","A003","A003"),
  value=c(40,38,55,10,12,16,18,77,87))
Run Code Online (Sandbox Code Playgroud)

我想将其子集化,以便code保留包含超过或低于给定数字的值的任何group().例如,如果我想要任何包含超过50的值的组,那么结果将如下所示:

dt2 <- data.table(
  code=c("A001", "A001","A001","A003","A003"),
  value=c(40,38,55,77,87))
Run Code Online (Sandbox Code Playgroud)

r subset data.table

3
推荐指数
1
解决办法
30
查看次数