2015-12-05 49 views
0

我有三个列表 - lat,long,wifiRssi。每个列表具有相同的行数。 lat和long将始终具有相同数量的每行元素。 wifiRssi通常比lat/long有更少的元素,但有时更多。我试图绘制这些值,但由于我的列表中的元素不相等,所以我收到一个界限异常。R子集 - 绘制不等列表

示例数据:

location_lat 
[32.831, 32.831, 32.832, 32.832, 32.833, 32.833, 32.834, 32.834, 
32.835, 32.835, 32.836, 32.836, 32.837, 32.837, 32.838] 



location_long 
[-96.691, -96.691, -96.692, -96.692, -96.693, -96.693, -96.694, -96.694, 
-96.695, -96.695, -96.696, -96.696, -96.697, -96.697, -96.698] 



wifi_Rssi 
[-81, -81, -81, -81, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0] 

代码段:

我剥去括号然后。 。 。在validObject(.Object)

wifiRssi <- opr$wifi_Rssi 
wifiRssi <- gsub(" ", "", wifiRssi, fixed = TRUE) 
wifiRssi <- strsplit(wifiRssi, ",") 
wifiRssi <- unlist(wifiRssi) 
wifiRssi <- as.integer(wifiRssi) 

lat<- as.character(opr$location_lat) 
lat<- gsub(" ", "", lat, fixed = TRUE) 
lat<- strsplit(lat, ",") 
lat<- unlist(lat) 
lat<- as.double(lat) 

long<- as.character(opr$location_long) 
long<- gsub(" ", "", long, fixed = TRUE) 
long<- strsplit(long, ",") 
long<- unlist(long) 
long<- as.double(long) 

pal <- colorNumeric(c('red','green'), wifiSNR) 

geoplots <- sp::SpatialPointsDataFrame(
    cbind(long, lat), 
    data.frame(wifiRssi) 
) 

错误: 无效类“SpatialPointsDataFrame”对象:在data.frame行和SpatialPoints的数量不匹配

我希望能够做的是什么截断列表中的元素数量最少。例如,如果wifiRSSI包含n个元素,而lat/long包含n + 5个元素 - 则将lat/lon截断为前n个元素[1:n]以匹配wifiRSSI,然后绘制。

任何意见或建议,将不胜感激。

+0

错字 - 应如下: geoplots < - SP :: SpatialPointsDataFrame( cbind(长,LAT), 数据。框架(wifiRssi) – JohnA

+1

你可以编辑你的问题! – jogo

回答

1

DrPositron的一个完整版本。

lat <- c(32.831, 32.831, 32.832, 32.832, 32.833, 32.833, 32.834, 32.834, 32.835, 32.835, 32.836, 32.836, 32.837, 32.837, 32.838) 

long <- c(-96.691, -96.691, -96.692, -96.692, -96.693, -96.693, -96.694, -96.694, -96.695, -96.695, -96.696, -96.696, -96.697, -96.697, -96.698) 

wifiRssi <- c(-81, -81, -81, -81, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0) 

shortest <- min(length(lat),length(long),length(wifiRssi)) 
geoplots <- sp::SpatialPointsDataFrame(
    cbind(long[1:shortest], lat[1:shortest]), 
    data.frame(wifiRssi[1:shortest]) 
) 

您对此评论感到担忧,它会从位置或wifiRssi的尾部丢弃数据。是的,它会。但是如果你缺少来自wifiRssi(比位置更少的值)或位置(wifiRssi比位置更多的值)的数据,那么对于你的数据结构,这是你能做的唯一的事情。我认为你的某些位置和/或信号强度更可能丢失,并且通过将数据表示为独立的向量,关于哪些位置与哪些信号强度混杂在一起的信息。这对我来说似乎更可能:

df <- data.frame(lat=NA,long=NA,wifiRssi) 
df[-ii,"lat"] <- lat 
df[-ii,"long"] <- long 

cc <- complete.cases(df) 
geoplots <- sp::SpatialPointsDataFrame(
    df[cc,1:2], 
    as.data.frame(wifiRssi=df[cc,3]) 
) 

这里丢失的坐标是随机分散在整个原始数据中,并非全部在最后。但是如果你只有3个不同长度的独立矢量,你必须对缺少的东西做一些假设。

+0

所有这些信息是非常有用的,我很欣赏反馈。在我的数据的情况下,纬度/长度将始终等长。 rssi列表通常会更长,但有时会更短。因此,我最终使用了mapply来截断lat/long到子元素的数量,然后我使用上面的技巧来完成绘图(基本上在平坦化之后再次截断数据)。结果是数据的更精确的渲染/绘图。 – JohnA

2

提取longlatwifiRssiopr后,你可以找到使用minlength最短向量的长度。然后,您可以使用head在进一步处理之前将每个缩短到此长度。

minlength<-min(length(long),length(lat),length(wifiRssi)) 
long<-head(long, minlength) 
lat<-head(lat,minlength) 
wifiRssi<-head(wifiRssi,minlength) 

虽然head可能更容易阅读,如果您正在使用大型载体这样做很多次,你可能需要使用其他方法。继@Joris Meys' analysis

          test replications elapsed relative 
1       expression(head(x, n))  1000000 22.749 3.315 
3        expression(x[1:n])  1000000 6.863 1.000 
2 expression(x[seq.int(to = n, length.out = n)])  1000000 12.612 1.838 

所以,lat[1:min.length],等会比head(lat,min.length)更快。基准代码:

require(rbenchmark) 
x <- 1:1e6 
n <- 500 
do.call(
    benchmark, 
    c(list(
    expression(head(x,n)), 
    expression(x[seq.int(to=n, length.out=n)]), 
    expression(x[1:n]) 
), replications=1e6) 
) 
+0

在仔细检查了这一点之后 - 这会丢弃大块的尾端数据。通过在名单被列入“不公开名单”之后,将名单的长度取为整个名单的大小,不是。我正在寻找的是基本上“逐行”的大小,以避免巨大的数据块被丢弃。 – JohnA

+0

@ atootoo处理向量中各个位置丢失数据的方法非常优雅。编辑答案以显示您可以在其他处理之前缩短矢量。还包括速度比较各种方式采取矢量的第一部分 – DrPositron