2015-12-05 66 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