R:根据不同长度

时间:2016-02-08 14:29:31

标签: r

我想将段ID分配给经度和纬度值,这些值落在存储在不同长度的不同数据帧中的最小/最大长度和纬度值的特定范围内。我的数据如下: 带观察的数据框:

head(obs)
longitude latitude
52.06264 6.412816 
52.06097 6.413106 
51.06097 6.413346 
54.06097 6.413276
51.06089 6.413114
52.05444 6.413094

包含范围和段ID的数据框:

head(seg)
segment   lon_max  lon_min  lat_max  lat_min
01a       6.857822 6.857476 51.05837 51.03489
01b       6.858979 6.857834 51.03433 50.99901
01c       6.860019 6.858982 51.99836 51.96330
01d       6.860960 6.860050 51.96277 51.92718
01e       6.862294 6.860979 51.92657 51.89125
01f       6.863179 6.862301 51.89059 51.85562

对于每个观察点,我想知道哪个'段'它会下降,所以我最终会得到这样的结果:

longitude latitude segment
52.03464 6.458816  1a
52.05667 6.416606  1a
51.06097 6.446346  1b
54.03757 6.413276  1c
51.06089 6.422114  1b
52.34243 6.413094  1a

我试图仅使用纬度进行此操作,但由于向量的长度不同,我收到错误消息。

obs[['segment']] <- for (i in obs$latitude) {
   if (i>=seg$lat_min & i<=seg$lat_max) {
     obs$segment=seg$segment
   } else {
     obs$segment='NA'}
}
  Error in `$<-.data.frame`(`*tmp*`, "segment", value = 1:118) : 
  replacement has 118 rows, data has 10284  

我知道为什么这样做无法正常工作,因为它不是逐行匹配,但我不知道如何做到这一点。如何逐行匹配每一对纬度和经度与最小值/最大值,直到找到它适合的范围并分配正确的segment_ID?

提前致谢!

2 个答案:

答案 0 :(得分:2)

您的经度和纬度在两个数据框架中混淆。

此外,您的示例数据无法匹配您的obs和seg,因为您的所有纬度都比lat_min的查找值小。

尽管如此,这应该有效。你正在尝试查表。

int defaults = Notification.DEFAULT_ALL;
        int flags = Notification.FLAG_NO_CLEAR;

Notification notif = ONots.notification(this, shown_top, ico, System.currentTimeMillis(), pIntent, contentTitle, contentText, flags, defaults);

            nm.cancel(_.NAKSNOT);
            nm.notify(_.NAKSNOT, notif);

我在回答你的问题时发现这很有帮助。

http://shashiasrblog.blogspot.com/2014/01/excel-style-vlookup-and-rangelookup-in-r.html

答案 1 :(得分:1)

给定一个带有组件&#34;经度&#34;的向量x。和&#34;纬度&#34;,函数f使用which.maxseg中找到合适的行。然后apply(obs,1,f)是长度nrow(obs)的向量,其中包含seg中相应段的行号:

obs <- read.table( header = TRUE,
                 text =
"latitude longitude
52.06264 6.412816 
51.90089 6.861084
52.06097 6.413106 
51.06097 6.413346 
54.06097 6.413276
51.04097 6.857576
51.06089 6.413114
51.95089 6.860084
52.05444 6.413094" )

seg <- read.table( header = TRUE,
                   stringsAsFactors = FALSE,
                   text = 
"segment   lon_max  lon_min  lat_max  lat_min
01a       6.857822 6.857476 51.05837 51.03489
01b       6.858979 6.857834 51.03433 50.99901
01c       6.860019 6.858982 51.99836 51.96330
01d       6.860960 6.860050 51.96277 51.92718
01e       6.862294 6.860979 51.92657 51.89125
01f       6.863179 6.862301 51.89059 51.85562")


f <- function(x)
{
  which.max( c( ( seg["lon_min"] <= c(x["longitude"]) ) &
                ( seg["lon_max"] >  c(x["longitude"]) ) &
                ( seg["lat_min"] <= c(x["latitude"])  ) &
                ( seg["lat_max"] >  c(x["latitude"])  ),
                TRUE                                      ) )
}

X <- cbind( obs, segment = seg$segment[apply(obs,1,f)] )

结果:

> X
  latitude longitude segment
1 52.06264  6.412816    <NA>
2 51.90089  6.861084     01e
3 52.06097  6.413106    <NA>
4 51.06097  6.413346    <NA>
5 54.06097  6.413276    <NA>
6 51.04097  6.857576     01a
7 51.06089  6.413114    <NA>
8 51.95089  6.860084     01d
9 52.05444  6.413094    <NA>