Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据两个独立数据库中的多个条件选择行_R_Date_Multiple Conditions - Fatal编程技术网

R 根据两个独立数据库中的多个条件选择行

R 根据两个独立数据库中的多个条件选择行,r,date,multiple-conditions,R,Date,Multiple Conditions,我有两个独立的数据集,一个包含事件日期。每个ID只有一个Eventdate。详情如下: data1 <- data.frame("ID" = c(1,2,3,4,5,6), "Eventdate" = c("2019-01-01", "2019-02-01", "2019-03-01", "2019-04-01", "2019-05-01", &quo

我有两个独立的数据集,一个包含事件日期。每个ID只有一个Eventdate。详情如下:

data1 <- data.frame("ID" = c(1,2,3,4,5,6), "Eventdate" = c("2019-01-01", "2019-02-01", "2019-03-01", "2019-04-01", "2019-05-01", "2019-06-01"))
data1
  ID  Eventdate
1  1 2019-01-01
2  2 2019-02-01
3  3 2019-03-01
4  4 2019-04-01
5  5 2019-05-01
6  6 2019-06-01
data2 <- data.frame("ID" = c(1,1,2,3,3,3,4,4,7), "Eventcode"=c(201,202,201,204,205,206,209,208,203),"Eventdate" = c("2019-01-01", "2019-01-01", "2019-02-11", "2019-02-15", "2019-03-01", "2019-03-15", "2019-03-10", "2019-03-20", "2019-06-02"))
data2
  ID Eventcode  Eventdate
1  1       201 2019-01-01
2  1       202 2019-01-01
3  2       201 2019-02-11
4  3       204 2019-02-15
5  3       205 2019-03-01
6  3       206 2019-03-15
7  4       209 2019-03-10
8  4       208 2019-03-20
9  7       203 2019-06-02
data1
  ID  Eventdate Eventdate.data2 Eventcode
1  1 2019-01-01      2019-01-01       201
2  2 2019-02-01      2019-02-11       201
3  3 2019-03-01      2019-03-01       205
4  4 2019-04-01                          
5  5 2019-05-01                          
6  6 2019-06-01 


非常感谢

您可以尝试以下方法:

library(dplyr)

left_join(data1, data2, by = 'ID') %>%
  group_by(ID, Eventdate.x) %>%
  summarise(Eventdate = Eventdate.y[Eventdate.y >= Eventdate.x][1], 
            Eventcode = {
              inds <- Eventdate.y >= Eventdate.x
              val <- sum(inds, na.rm = TRUE)
              if(val == 1) Eventcode[inds]
              else if(val > 1) sample(Eventcode[inds], 1)
              else NA_real_
              })

#    ID Eventdate.x Eventdate  Eventcode
#  <dbl> <chr>       <chr>          <dbl>
#1     1 2019-01-01  2019-01-01       201
#2     2 2019-02-01  2019-02-11       201
#3     3 2019-03-01  2019-03-01       205
#4     4 2019-04-01  NA                NA
#5     5 2019-05-01  NA                NA
#6     6 2019-06-01  NA                NA

您可以尝试以下方法:

library(dplyr)

left_join(data1, data2, by = 'ID') %>%
  group_by(ID, Eventdate.x) %>%
  summarise(Eventdate = Eventdate.y[Eventdate.y >= Eventdate.x][1], 
            Eventcode = {
              inds <- Eventdate.y >= Eventdate.x
              val <- sum(inds, na.rm = TRUE)
              if(val == 1) Eventcode[inds]
              else if(val > 1) sample(Eventcode[inds], 1)
              else NA_real_
              })

#    ID Eventdate.x Eventdate  Eventcode
#  <dbl> <chr>       <chr>          <dbl>
#1     1 2019-01-01  2019-01-01       201
#2     2 2019-02-01  2019-02-11       201
#3     3 2019-03-01  2019-03-01       205
#4     4 2019-04-01  NA                NA
#5     5 2019-05-01  NA                NA
#6     6 2019-06-01  NA                NA
这是否有效:

library(dplyr)
data1 %>% rename(Eventdate_dat1 = Eventdate) %>% left_join(data2, by = 'ID') %>% 
group_by(ID) %>% filter(Eventdate >= Eventdate_dat1) %>% 
mutate(Eventdate = case_when(length(unique(Eventdate)) > 1 ~ min(Eventdate), TRUE ~ Eventdate),
Eventcode = case_when(length(unique(Eventcode)) > 1 ~ min(Eventcode), TRUE ~ Eventcode)) %>% 
distinct() %>% right_join(data1, by = 'ID') %>% select(ID, 'Eventdate' = Eventdate.y, 'Eventdate.data2' = Eventdate.x, Eventcode)
# A tibble: 6 x 4
# Groups:   ID [6]
     ID Eventdate  Eventdate.data2 Eventcode
  <dbl> <chr>      <chr>               <dbl>
1     1 2019-01-01 2019-01-01            201
2     2 2019-02-01 2019-02-11            201
3     3 2019-03-01 2019-03-01            205
4     4 2019-04-01 NA                     NA
5     5 2019-05-01 NA                     NA
6     6 2019-06-01 NA                     NA
这是否有效:

library(dplyr)
data1 %>% rename(Eventdate_dat1 = Eventdate) %>% left_join(data2, by = 'ID') %>% 
group_by(ID) %>% filter(Eventdate >= Eventdate_dat1) %>% 
mutate(Eventdate = case_when(length(unique(Eventdate)) > 1 ~ min(Eventdate), TRUE ~ Eventdate),
Eventcode = case_when(length(unique(Eventcode)) > 1 ~ min(Eventcode), TRUE ~ Eventcode)) %>% 
distinct() %>% right_join(data1, by = 'ID') %>% select(ID, 'Eventdate' = Eventdate.y, 'Eventdate.data2' = Eventdate.x, Eventcode)
# A tibble: 6 x 4
# Groups:   ID [6]
     ID Eventdate  Eventdate.data2 Eventcode
  <dbl> <chr>      <chr>               <dbl>
1     1 2019-01-01 2019-01-01            201
2     2 2019-02-01 2019-02-11            201
3     3 2019-03-01 2019-03-01            205
4     4 2019-04-01 NA                     NA
5     5 2019-05-01 NA                     NA
6     6 2019-06-01 NA                     NA

非常感谢你!你的方法很有用。我想第二个对我来说已经足够了!非常感谢你!你的方法很有用。我想第二个对我来说已经足够了!非常感谢你!你的回答对我也有帮助@用户13538376,如果您发现答案有用,请单击答案旁边的勾号或向上投票,接受最有用的答案。非常感谢!你的回答对我也有帮助@用户13538376,如果您发现答案有用,您是否可以通过单击答案旁边的勾号或向上投票选择有用的答案来接受最有用的答案。