我有两个数据帧。第一个有关于个人身份证、工作场所的时期和城市的信息。第二个数据集包含个人身份和终身学习城市学位的信息。一个人可以在同一时期在不同的地方工作,也可以拥有多个学位。我想在第一个数据帧中添加一列,告知此人是否在指定时期拥有与她工作的城市相同的学位。
考虑下面这个非常简单的例子。数据帧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 joining
mydf1and
mydf2_聚合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
上连接mydf2
和mydf2_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