【问题标题】:R Subsetting - Plotting Unequal ListsR子集 - 绘制不等列表
【发布时间】:2016-03-10 12:53:32
【问题描述】:

我有三个列表——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,然后进行绘图。

任何想法或建议将不胜感激。

【问题讨论】:

  • 错字 - 应该读作:geoplots
  • 你可以编辑你的问题!

标签: r


【解决方案1】:

opr中提取longlatwifiRssi后,可以使用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)
)

【讨论】:

  • 在仔细检查后 - 这将丢弃尾端数据块。通过在列表“未列出”之后获取列表的长度来获取整个列表的大小,不是吗。我正在寻找的是基本上采用“逐行”的大小以避免丢弃大量数据。
  • @atiretoo 处理向量中不同位置缺失数据的方法很优雅。编辑的答案表明您可以在其他处理之前缩短向量。还包括获取向量第一部分的各种方式的速度比较
【解决方案2】:

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 个不同长度的独立向量,你必须对缺失的内容做出一些假设。

【讨论】:

  • 所有这些信息都非常有帮助,感谢您的反馈。就我的数据而言,纬度/经度始终是相等的长度。 rssi 列表通常会更长,但有时会更短。结果,我最终使用 mapply 将 lat/long 截断为子元素的数量,然后我使用上面的技术来完成绘图(基本上在数据被展平后再次截断数据)。结果是更准确的数据渲染/绘图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2014-03-15
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多