这个东西用which比较难写, 而且直接在这两个data frame间比较,逻辑很烦。我把第一个data frame重新调整了一下来做,逻辑上好写。 dplyr的pipeline一直会出错,所以用了很多的for循环,但应该可以得到你要的结果
- library(dplyr)
- a=data.frame(Cntry=c('中国、美国','德国','日本、朝鲜'),
- Val=c(1,6,10),
- stringsAsFactors=F)
- b=data.frame(Cntry=c('中国','德国、法国','泰国','美国'),
- Val=NA,
- stringsAsFactors=F)
- # Function to get the value in a by country name--------------
- GetVal=function(Cntry)
- {
- Val=NA
- for (i in 1:nrow(a))
- {
- x=a$Cntry[i] %>%
- strsplit(.,split='、') %>%
- unlist
- if(Cntry %in% x) Val=a$Val[i]
- }
- return(Val)
- }
- # Get an organized data frame -------
- a$Cntry %>%
- strsplit(,split='、') %>%
- unlist %>%
- data.frame(Cntry_NM=.,Val=NA,
- stringsAsFactors=F) -> base
- for(i in 1:nrow(base))
- {
- base$Val[i]=GetVal(base$Cntry_NM[i])
- }
- for(i in 1:nrow(b))
- {
- Ind=base$Cntry_NM %in% unlist(strsplit(b$Cntry,split='、')[i])
- if(sum(Ind)>0) b$Val[i]=base$Val[Ind]
- }
复制代码