首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模糊连接-匹配单边

模糊连接-匹配单边
EN

Stack Overflow用户
提问于 2019-11-26 20:12:08
回答 1查看 251关注 0票数 0

我试图从一个表(myChickWts)中收集体重值,该表是在另一个表(小鸡血)记录的每一个血样前一周收集的。我想要一份从每一次血样前一周的血液日期和相关重量的清单。我尝试了几种不同的方法,在我的结果中包含了血样日期之后,我一直在获取日期。

在本例中,匹配返回(1/9、1/11、1/13)之前和(1/15)之后的日期。这两张桌子怎么配?我也尝试了difference_join,但它返回了结果7天前和7天后,我的另一个结果-再次,不是我想要的。

代码语言:javascript
复制
Chick   Date.x (blood)  Date.y (weight)  Chick.y  Weight.y
10     2019-01-14       2019-01-09       10       74
10     2019-01-14       2019-01-11       10       81
10     2019-01-14       2019-01-13       10       89
10     2019-01-14       2019-01-15       10       96




library(tidyverse)
library(lubridate)
library(fuzzyjoin)

导入数据(用于reprex的样本数据)

代码语言:javascript
复制
mychickwts <- datasets::ChickWeight %>%
  mutate(Date = date("2019-01-01") + Time) %>%
  select(Date, Chick, weight) %>%
  filter(Chick <= 10)

chickblood <- data.frame(
       Chick = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7,
                 8, 8, 8, 9, 9, 9, 10, 10, 10),
        Date = date(c("2019-01-01", "2019-01-12", "2019-01-22", "2019-01-06",
                 "2019-01-15", "2019-01-22", "2019-01-05", "2019-01-07",
                 "2019-01-14", "2019-01-03", "2019-01-08", "2019-01-11", "2019-01-02",
                 "2019-01-20", "2019-01-23", "2019-01-12", "2019-01-16",
                 "2019-01-18", "2019-01-10", "2019-01-10", "2019-01-22", "2019-01-03",
                 "2019-01-04", "2019-01-08", "2019-01-06", "2019-01-14",
                 "2019-01-17", "2019-01-02", "2019-01-14", "2019-01-21")))

确定体重日期是否在血检日期的前一周。

代码语言:javascript
复制
compare <- function(a, b) {
  (a - b) <= 7
}

在过去的7天里,得到一张每一次血量和所有匹配体重的表格。这不管用。

代码语言:javascript
复制
chickblood %>%
fuzzy_left_join(
  mychickwts,
  by = c(
    "Chick" = "Chick",
    "Date" = "Date"
    ),
  match_fun = list(`==`, `compare`)
  )

我也尝试了difference_join,但在这种情况下,我似乎不知道如何让它与小鸡匹配,它在约会前后都会返回。

代码语言:javascript
复制
   chickblood %>%
    difference_join(mychickwts, by = "Date",
       max_dist = 7
      )

我试过在%内使用%,而不是运气。这会返回一个错误,我不知道确切的原因。

代码语言:javascript
复制
chickblood %>%
fuzzy_left_join(
  mychickwts,
  by = c("Chick" = "Chick", 
         "Date" = "Date"),
  match_fun = list("==", "%within%")
  ) %>%
  arrange(Date.x)

Error in which(m) : argument to 'which' is not logical
EN

回答 1

Stack Overflow用户

发布于 2019-11-28 03:33:56

由于数据集不太大,您只需在“Chick”上做一个正常的左连接,然后确定体重日期是否在血液工作日期的前一周。从那里你可以保留你想要的行。

代码语言:javascript
复制
library(tidyverse)
library(lubridate)
library(fuzzyjoin)

mychickwts$Chick <- as.numeric(mychickwts$Chick)

chickblood %>% 
  left_join(mychickwts, by = "Chick", suffix = c(".blood", ".wt")) %>% 
  mutate(wt_days_prior = Date.blood - Date.wt) %>% 
  mutate(wt_in_week_prior = wt_days_prior <= 7 & wt_days_prior >= 0) %>% 
  filter(wt_in_week_prior)

或者,如果您想在单个联接中执行此操作,则类似的操作可能会有效。

代码语言:javascript
复制
chickblood %>% 
  fuzzy_left_join(mychickwts, by = c("Chick", "Date"),
                  match_fun = list(`==`, function(x, y) x - y >= 0 & x - y <= 7)
  )

fuzzy_left_join替换为fuzzy_inner_join,只保留前一周有体重日期的血样测量值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59058698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档