2015-12-05 6 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] 

Код сниппета:

Я сдирать скобки тогда. , ,

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) 
) 

Ошибка в validObject (.Object): недопустимый класс «SpatialPointsDataFrame» объект: количество строк в data.frame и SpatialPoints не совпадают

То, что я хочу, чтобы быть в состоянии сделать это усечение список к наименьшему числу элементов. Например, если wifiRSSI содержал n элементов и lat/long содержало n + 5 элементов, то обрезайте lat/lon в первые n элементов [1: n], чтобы соответствовать wifiRSSI, затем запишите.

Любые идеи или предложения будут оценены.

+0

Typo - следует читать как: геополитические горизонты <- sp :: SpatialPointsDataFrame ( cbind (long, lat), данные.frame (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

Вся эта информация была очень полезной, и я ценю обратную связь. В случае моих данных lat/long всегда будет иметь одинаковую длину. Список rssi обычно будет длиннее, но иногда короче. В результате я закончил использование mapply для обрезания lat/long до количества подэлементов, после чего я использовал технику выше, чтобы закончить график (в основном, усекаем данные снова после того, как он был сплющен). Результатом стал более точный рендеринг/график данных. – JohnA

2

После извлечения long, lat и wifiRssi из opr, вы можете найти длину кратчайшего вектора с помощью min и length. Затем вы можете использовать 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

Подход atiretoo @ atiretoo к работе с отсутствующими данными в разных местах в векторах является изящным. отредактированный ответ, чтобы показать, что вы можете сократить векторы до другой обработки. также включало сравнение скорости различных способов взять первую часть вектора – DrPositron

Смежные вопросы