R 查看矢量化对以返回匹配值

R 查看矢量化对以返回匹配值,r,dplyr,rowwise,across,R,Dplyr,Rowwise,Across,关于我在这里提出的一个问题: 初始数据示例: person start_loc start_date end_date.1 end_date.2 end_date.3 end_loc.1 end_loc.2 end_loc.3 1 1 a 2021-02-10 2021-02-17 <NA> <NA> g 2 2 a 2021-01-30

关于我在这里提出的一个问题:

初始数据示例:

  person start_loc start_date end_date.1 end_date.2 end_date.3 end_loc.1 end_loc.2 end_loc.3
1      1         a 2021-02-10 2021-02-17       <NA>       <NA>         g                    
2      2         a 2021-01-30 2020-09-29 2020-12-12 2021-02-04         a         a         g
3      3         g 2020-12-04       <NA>       <NA>       <NA>                              
4      4         r 2020-12-09 2020-12-12 2020-12-14 2021-01-05         c         c         g
5      5         t 2021-03-22 2021-03-25 2021-03-29       <NA>         b         t          
6      6         b 2021-04-04 2021-04-07 2021-04-09       <NA>         b         t          

example <- structure(list(person = 1:6, start_loc = c("a", "a", "g", "r", 
"t", "b"), start_date = structure(c(18668, 18657, 18600, 18605, 
18708, 18721), class = "Date"), end_date.1 = structure(c(18675, 
18534, NA, 18608, 18711, 18724), class = "Date"), end_date.2 = structure(c(NA, 
18608, NA, 18610, 18715, 18726), class = "Date"), end_date.3 = structure(c(NA, 
18662, NA, 18632, NA, NA), class = "Date"), end_loc.1 = c("g", 
"a", "", "c", "b", "b"), end_loc.2 = c("", "a", "", "c", "t", 
"t"), end_loc.3 = c("", "g", "", "g", "", "")), class = "data.frame", row.names = c(NA, 
-6L))

从上一个问题开始,我采用了一些技巧,比如跨使用
c_,跨
使用
,但我似乎无法让R返回单个输出。这可能吗?我是否需要再次长时间构建数据?

您可以使用
dplyr
tidyr

库(dplyr)
图书馆(tidyr)
tmp0%
pivot_longer(cols=start_with(“end_date”)、name_to=c(“id”)、name_pattern=“end_date.()”、values_to=“end_date”、values_drop\u na=TRUE)%>%
枢轴长度(cols=以(“结束位置”)开始,名称到=c(“id2”),名称到模式=“结束位置”()”,值到=“结束位置”,值到下拉位置=真)%>%
筛选器(id==id2,结束日期=开始日期)%>%
选择(-id,-id2)%>%
分组人(人)
tmp1%
当(结束位置==开始位置~结束日期,
真~NA_real(真)]>%
筛选器(结束日期==匹配)%>%
选择(-match)
tmp2%
筛选器(结束日期==min(结束日期))%>%
反联合(tmp1,by=c(“人员”))
tmp1%>%
绑定_行(tmp2)%>%
右加入(例如,by=c(“人员”、“开始地点”、“开始日期”))%>%
安排(人员、开始地点、开始日期)
返回

#一个tible:6 x 11
#组别:人[6]
人员开始日期结束日期结束日期结束日期1结束日期2结束日期3结束位置1结束位置2
1 1 a 2021-02-10 2021-02-17 g 2021-02-17 NA NA“g”
2 a 2021-01-30 2021-02-04 g 2020-09-29 2020-12-12 2021-02-04“a”字
3 g 2020-12-04不适用
4 4 r 2020-12-09 2020-12-12 c 2020-12-12 2020-12-14 2021-01-05“c”
5 5T 2021-03-22 2021-03-29 t 2021-03-25 2021-03-29 NA“b”t
6 6 b 2021-04-04 2021-04-07 b 2021-04-07 2021-04-09 NA“b”t
# ... 还有1个变量:结束位置3

我正在建立三个临时表来获取所需的信息
tmp1
包含具有相同起始位置和结束位置的数据,
tmp2
查看具有不同位置的数据。最后,我们将这两个表组合起来,创建所需的输出。

您可以使用
dplyr
tidyr

库(dplyr)
图书馆(tidyr)
tmp0%
pivot_longer(cols=start_with(“end_date”)、name_to=c(“id”)、name_pattern=“end_date.()”、values_to=“end_date”、values_drop\u na=TRUE)%>%
枢轴长度(cols=以(“结束位置”)开始,名称到=c(“id2”),名称到模式=“结束位置”()”,值到=“结束位置”,值到下拉位置=真)%>%
筛选器(id==id2,结束日期=开始日期)%>%
选择(-id,-id2)%>%
分组人(人)
tmp1%
当(结束位置==开始位置~结束日期,
真~NA_real(真)]>%
筛选器(结束日期==匹配)%>%
选择(-match)
tmp2%
筛选器(结束日期==min(结束日期))%>%
反联合(tmp1,by=c(“人员”))
tmp1%>%
绑定_行(tmp2)%>%
右加入(例如,by=c(“人员”、“开始地点”、“开始日期”))%>%
安排(人员、开始地点、开始日期)
返回

#一个tible:6 x 11
#组别:人[6]
人员开始日期结束日期结束日期结束日期1结束日期2结束日期3结束位置1结束位置2
1 1 a 2021-02-10 2021-02-17 g 2021-02-17 NA NA“g”
2 a 2021-01-30 2021-02-04 g 2020-09-29 2020-12-12 2021-02-04“a”字
3 g 2020-12-04不适用
4 4 r 2020-12-09 2020-12-12 c 2020-12-12 2020-12-14 2021-01-05“c”
5 5T 2021-03-22 2021-03-29 t 2021-03-25 2021-03-29 NA“b”t
6 6 b 2021-04-04 2021-04-07 b 2021-04-07 2021-04-09 NA“b”t
# ... 还有1个变量:结束位置3

我正在建立三个临时表来获取所需的信息
tmp1
包含具有相同起始位置和结束位置的数据,
tmp2
查看具有不同位置的数据。最后,我们合并这两个表并创建所需的输出。

很抱歉延迟响应,但您可以这样做

  • 人员应该有一个结果(可能是dput中的输入错误)
  • 将数据中的空字符串“”替换为NA
example%left\u join(example%>%pivot\u更长(cols=!c(person,start\u loc,start\u date),names\u sep='\\',
name_to=c('.value',number'),
数值_drop_na=T)%>%
分组单位(人)%>%
变异(差异=结束日期-开始日期,
cond2=diff=0,
cond1=开始位置==结束位置%>%
过滤器(cond2)%>%
安排(人-条件1,差异)%>%
总结(结束日期=第一个(结束日期),
end_loc=第一(end_loc)),by='person')
#>人员开始日期开始日期结束日期1结束日期2结束日期3结束日期1
#>1A 2021-02-10 2021-02-17 g
#>2021-01-30 2020-09-29 2020-12-12 2021-02-04 a
#>3 g 2020-12-04
#>4 4 r 2020-12-09 2020-12-12 2020-12-14 2021-01-05 c
#>5T 2021-03-22 2021-03-25 2021-03-29 b
#>6 6 b 2021-04-04 2021-04-07 2021-04-09 b
#>结束位置2结束位置3结束日期结束位置
#>12021-02-17克
#>2 a g 2021-02-04
 person start_loc start_date end_date.1 end_date.2 end_date.3 end_loc.1 end_loc.2 end_loc.3   end_date end_loc
1      1         a 2021-02-10 2021-02-17       <NA>       <NA>         g                     2021-02-17       g
2      2         a 2021-01-30 2020-09-29 2020-12-12 2021-02-04         a         a         g       <NA>        
3      3         g 2020-12-04       <NA>       <NA>       <NA>                                     <NA>        
4      4         r 2020-12-09 2020-12-12 2020-12-14 2021-01-05         c         c         g 2020-12-12       c
5      5         t 2021-03-22 2021-03-25 2021-03-29       <NA>         b         t           2021-03-29       t
6      6         b 2021-04-04 2021-04-07 2021-04-09       <NA>         b         t           2021-04-07       b
example %>% pivot_longer(cols = !c(person, start_loc, start_date), names_sep = '\\.', 
                                               names_to = c('.value', 'number'),
                                               values_drop_na = T) %>%
                        group_by(person) %>%
                        mutate(diff = end_date - start_date,
                               cond2 = diff <= 7 & diff >= 0,
                               cond1 = start_loc == end_loc) %>%
                        filter(cond2) %>%
                        arrange(person, -cond1, diff) %>%
                        summarise(end_date = first(end_date),
                                  end_loc = first(end_loc))

# A tibble: 5 x 3
  person end_date   end_loc
   <int> <date>     <chr>  
1      1 2021-02-17 g      
2      2 2021-02-04 g      
3      4 2020-12-12 c      
4      5 2021-03-29 t      
5      6 2021-04-07 b