R子集 - 绘制不等的列表

时间:2015-12-05 16:27:47

标签: r

我有三个列表 - 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然后绘制。

任何想法或建议都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

long中提取latwifiRssiopr后,您可以使用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个不同长度的独立向量,你必须对缺少的东西做一些假设。