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