我有三个列表 - lat,long,wifiRssi。每个列表具有相同的行数。 lat和long将始终具有相同数量的元素。 wifiRssi通常比lat / long更少,但有时更多。我试图绘制这些值,但由于我的列表元素不相等,我收到一个边界异常。
示例数据:
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 :(得分:2)
从long
中提取lat
,wifiRssi
和opr
后,您可以使用min
和{{1}找到最短矢量的长度}。然后,您可以在进一步处理之前使用length
将每个缩短到此长度。
head
虽然minlength<-min(length(long),length(lat),length(wifiRssi))
long<-head(long, minlength)
lat<-head(lat,minlength)
wifiRssi<-head(wifiRssi,minlength)
可能更具可读性,但如果您使用大型向量多次执行此操作,则可能需要使用其他方法。关注@Joris Meys' analysis:
head
因此, 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)
答案 1 :(得分: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个不同长度的独立向量,你必须对缺少的东西做一些假设。