我试着在这里问一个问题,因为我没有找到更好的解决方案,否则堆叠在哪里..
在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
}
}
}
}
}
答案 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)))