连接两个数据集,其中关键变量出现在左右数据集中的多行中:R



我有两个数据帧。第一个有关于个人身份证、工作场所的时期和城市的信息。第二个数据集包含个人身份和终身学习城市学位的信息。一个人可以在同一时期在不同的地方工作,也可以拥有多个学位。我想在第一个数据帧中添加一列,告知此人是否在指定时期拥有与她工作的城市相同的学位。

考虑下面这个非常简单的例子。数据帧mydf1通知(i(个体A在时段1和时段2都在城市x和y工作,(ii(个体B在时段1、时段2在城市w工作,并且在时段1在城市k工作,(iii(个体C在时段1中在城市k中工作。数据帧mydf2显示:(i(个体A在城市x和w学习,(ii(个体B在城市x、k学习,(iii(个体C在城市y、k学习。

mydf1 <- data.frame(id=c('A','A','A','A','B','B','B','C'),
period=c(1,1,2,2,1,1,2,1),
work_city=c('x','y','x','y','w','k','w','k'))
mydf2 <- data.frame(id=c('A','A','B','B','C','C'),
study_city=c('x','w','x','k','y','k'))

我的输出应该如下,其中,如果相应行的work_city的值与该特定个体的数据集mydf2中变量study_city的任何值一致,则指示符变量same_city等于1。例如:对于单个A,如果work_city等于"x"或"w",则变量same_city应为1,否则应为0。

mydf_final <- data.frame(id=c('A','A','A','A','B','B','B','C'),
period=c(1,1,2,2,1,1,2,1),
work_city=c('x','y','x','y','w','k','w','k'),
same_city=c('1','0','1','0','0','1','0','1'))

通过聚合mydf2 by id and putting all study cities in a list. After joiningmydf1andmydf2_聚合we check if the工作_城市for each row appears in the研究_城市的可能解决方案`list:

mydf1 <- data.frame(id=c('A','A','A','A','B','B','B','C'),
period=c(1,1,2,2,1,1,2,1),
work_city=c('x','y','x','y','w','k','w','k'))
mydf2 <- data.frame(id=c('A','A','B','B','C','C'),
study_city=c('x','w','x','k','y','k'))

通过id聚合mydf2,并将study_cities的所有值放在列表中。现在每个唯一的id只有一行。

library(dplyr)
mydf2_aggr <- mydf2 %>% 
group_by(id) %>% 
summarise(study_cities = list(study_city))

id上连接mydf2mydf2_aggr,并使用rowwise函数,这样我们就可以在每行study_cities列表上使用一个简单的ifelse。可能存在不必使用rowwise的解决方案。。。我添加的专栏study_cities_as_string只是为了说明我的答案!

mydf_final <- mydf1 %>% 
left_join(mydf2_aggr, by="id") %>%
rowwise() %>% 
mutate(study_cities_as_string = paste(study_cities, collapse=","),
same_city = ifelse(work_city %in% study_cities, 1, 0)) %>% 
select(-study_cities)

mydf_final现在是:

id    period work_city study_cities_as_string same_city
<chr>  <dbl> <chr>     <chr>                      <dbl>
1 A          1 x         x,w                            1
2 A          1 y         x,w                            0
3 A          2 x         x,w                            1
4 A          2 y         x,w                            0
5 B          1 w         x,k                            0
6 B          1 k         x,k                            1
7 B          2 w         x,k                            0
8 C          1 k         y,k                            1

最新更新