基于多个条件在另一个字符串中搜索字符串的高效代码?

时间:2017-03-17 08:14:27

标签: r

我试着在这里问一个问题,因为我没有找到更好的解决方案,否则堆叠在哪里..

在data.frame" id"我想收集他们在data.frame" test"中引用他们的名字的次数。基于colCiting在colYear和colCitingYear条件下发生colName的次数。示例:如果在colName har year 1中lok并且在第3年引用它应该在第3年将id添加1,如果colYear和colCitingYear的差异大于5,则不应计算。

示例代码似乎正在工作但速度慢。关于如何加快速度的任何建议?实际数据集有大约500 000行colCiting和1000 id行。

colID<-c("ewry","potta","potta","ewry")
colName<-c("lok","tro","hopp","asl")
colCiting<-c("lok trohopp","potta ar as","ewry","potta hopp")
colYear<-c(1,1,2,3)
colCitingYear<-c(6,5,9,12)
test<-data.frame(colID,colName,colYear,colCiting,colCitingYear)
cola<-c("ewry","potta")
id<-data.frame(cola)
    for (i in 2:15) {
      id[,i]<-0
      colnames(id)[i]<-paste0("y",+i-1)
    }

    for(z in 2:ncol(id)){
      for(i in 1:nrow(id)){
        for(j in 1:nrow(test)){
          for(k in 1:nrow(test)){
            if(as.character(id[i,1])==as.character(test[j,1])&test[j,3]==(test[k,5]+2-z)&(test[k,5]-test[j,3])<=5&(test[k,5]-test[j,3])>0&grepl(test[j,2],test[k,4])){
              id[i,z]<-id[i,z]+1
            }
          }
        }
      }
    }

2 个答案:

答案 0 :(得分:0)

我从

开始
cond1 <- with(test, colCitingYear - colYear) < 6
cond2 <- with(test, mapply(grepl, colName, colCiting))

with(test[cond1 & cond2, ], table(colID, colCitingYear))

我不清楚确切的条件是什么,所以这些可能不是100%准确,但希望你会得到这个想法。这里cond2的计算效率仍然很低,如有必要可以改进。

答案 1 :(得分:0)

我不确定这是否有效,但无论如何你都可以尝试:

require(dplyr)

fun <- function(x) {
            y <- test[test$colID==x | grepl(x,test$colCiting,fixed=TRUE),] 
            z <- test[with(test,colCiting %in% unique(grep(paste(y$colName,collapse="|"),test$colCiting, value=TRUE))),]
            a <-rbind(y,z) %>% group_by(colID,colName) %>% filter(row_number()==1) %>% data.frame() %>%
            mutate(ind = ifelse(abs(colYear - colCitingYear)<=5,colCitingYear,0))
            res <- t(data.frame((1:max(test$colCitingYear) %in% a$ind)*1,row.names=NULL)) ; rownames(res) <- x ; colnames(res) <- paste0("year_",1:max(test$colCitingYear))
            return(res)
        }   
do.call(rbind,lapply(cola,function(x) fun(x)))