【问题标题】:Count match ratio between two dataset计算两个数据集之间的匹配率
【发布时间】:2017-12-08 21:37:03
【问题描述】:

我有两个数据集想要计算匹配率

> events_data       
  LONGITUDE LATITUDE  matchvalue
1     122.5    9.5    0.006269592
2     122.5   10.5    0.050156740
3     125.5   10.5    0.043887147
4     146.5   40.5    0.048213166
5     142.5   40.5    0.035078370
6     146.5   40.5    0.028213166

> events            
  LATITUDE LONGITUDE
1    9.880  124.1167
2   37.156  144.6611
  1. 使用事件(经纬度均在5以内)选择events_data中的数据
  2. 当events_data.matchvalue > 0.04时,设置events_data中的该行数据为true,或者为flase
  3. 计数匹配率 = (events_data 中的totalRows 为真)/(events_data 中的totalRows 为真 + events_data 中的totalRows 为假)

以事件 1 为例

1. select data in events_data within latitude(9.880 +/- 5) and longitude(124.1167 +/-5),you can get data in events_data:
   LONGITUDE LATITUDE  matchvalue 
 1     122.5    9.5    0.006269592
 2     122.5   10.5    0.050156740
 3     125.5   10.5    0.043887147
2. count(events_data.matchvalue > 0.04) = 2
3. count match Ratio = 2/3 = 0.67

我的期望是添加一个新列 match_Ratio

  LATITUDE LONGITUDE  match_Ratio
1    9.880  124.1167  0.67
2   37.156  144.6611  0.33

我使用的数据是:

events_data <- structure(list(LONGITUDE = c(122.5, 122.5, 122.5, 146.5, 142.5, 
146.5), LATITUDE = c(9.5, 10.5, 10.5, 40.5, 40.5, 40.5
), matchvalue = c(0.00626959247648903, 0.0501567398119122, 0.0438871473354232, 
0.0482131661442006, 0.0350783699059561, 0.0282131661442006)), .Names = c("LONGITUDE", 
"LATITUDE", "matchvalue"), row.names = c(NA, 6L), class = "data.frame")

events <- structure(list(LATITUDE = c(9.88, 37.156), LONGITUDE = c(124.1167, 
144.6611)), .Names = c("LATITUDE", "LONGITUDE"), class = "data.frame", row.names = 1:2)

如何实现,谢谢

【问题讨论】:

  • 如果您认为您的帖子中有错误。 count(events_data.matchvalue &gt; 0.04) = 2 应该是 3,因为它们都大于 0.04。这将使match_Ratio = 1.
  • 第一个是0.006269592
  • 啊啊啊,太好了……忽略了多余的零。

标签: r list dataframe match


【解决方案1】:

这是一个简单的base R 解决方案。

long <- events_data$LONGITUDE
lat <- events_data$LATITUDE
myVals <- events_data$matchvalue

events$match_Ratio <- apply(events, 1, function(x) {
    z <- which(lat > (x[1] - 5) & lat < (x[1] + 5))
    v <- which(long > (x[2] - 5) & long < (x[2] + 5))
    ind <- intersect(z, v)
    sum(myVals[ind] > 0.04)/length(ind)
})

events
  LATITUDE LONGITUDE match_Ratio
1    9.880  124.1167   0.6666667
2   37.156  144.6611   0.3333333

【讨论】:

  • 谢谢约瑟夫,如果我添加一个条件 TIME, t (x[3] - 15) & time 这样的语句
  • @Pan,是的,那肯定行得通!这是假设您在两个 data.frames 中都有第三列时间。
  • 当我应用到我的真实数据时,它有错误: x[3] - 5 中的错误:二进制运算符的非数字参数,x[3] 在这里表示 LONGITUDE,你知道为什么吗?如何解决?
  • @Pan,如果没有看到一些代表您的真实数据的实际数据,就很难看出问题所在。一般来说,如果您想要好的答案,您需要提供所有相关信息以及您的 attempted 解决方案(这是您上面的问题所缺少的......除此之外,您还有一个非常好的问题)。如果您愿意,您可以编辑上面的问题,提供有关您的情况以及您尝试过的更多详细信息。
  • @Pan,我并不是要严厉...我真的很想帮忙。我希望我之前的评论没有阻止您寻求额外的帮助。任何人,如果您编辑您的问题,我会尽力为您提供一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多