楼主: iristaw
2098 1

[有偿编程] 现有程序纠错:对Web of Science数据文件的处理(提取所需要字段) [推广有奖]

  • 0关注
  • 0粉丝

已卖:3份资源

大专生

41%

还不是VIP/贵宾

-

威望
0
论坛币
2819 个
通用积分
0.6600
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
571 点
帖子
9
精华
0
在线时间
95 小时
注册时间
2013-4-3
最后登录
2023-1-10

楼主
iristaw 发表于 2017-6-29 16:37:24 |AI写论文
28论坛币
前情说明:需要将地址(C1)字段中的国家提取出来,C1为地址字段(此字段中包括作者、机构、国家,我需要提取国家出来)现编辑程序如下:
#read file

wos.file.read <- function(file.name) {

    file.items <- read.delim(file = file.name, header = F, row.names = NULL, encoding = "UTF-8", sep = "\t", dec = ".", quote = "", comment.char = "", colClasses = "character")

    headers <- file.items[1,]

    for (i in 1:ncol(file.items)) {
        colnames(file.items) <- headers
    }
    row.names(file.items) <- NULL
    return(file.items[-1,])
}


#由于合著行为,一条记录的地址字段会有多个作者,相应多个国家,故要将地址字段按“;”分割,但由于此字段也包含作者,作者信息中也有“;”,所以要先替换“[]”中的“;”为“#”
wos.string.replace <- function(line, oldchar, newchar) {
  reg <- "\\[(\\s|\\S)*?\\]"
  pos <- str_locate_all(line,reg)
  lines <- str_sub(line, start = pos[[1]][, "start"], end = pos[[1]][, "end"])

  for (i in seq_along(lines)) {

    pos.new <- str_locate_all(lines, oldchar)

    pos.new <- pos.new[[1]] + pos[[1]][i, "start"] - 1

    for (i in seq_along(pos.new[, "start"])) {
      str_sub(line, start = pos.new[i, "start"], end = pos.new[i, "end"]) <- newchar
    }
  return(lines[[1]])
    }
  return(lines)
}

#现按 ";"进行分割
wos.item.addresses <- function(line) {
  #不为空或者包括;
  splitchar<-";"
  if (length(line)!=0) {
    if(str_detect(line,splitchar)>0){
      terms <- strsplit(line,splitchar)
      terms <- as.character(terms)
      return(terms[[1]])
    }
  }
  return(terms)
}

#提取国家
wos.item.countries <- function(terms) {
  locatechar <- ","
  if (length(terms)!=0){
  allcomma <-str_locate_all(terms,locatechar)
  rownum<-nrow(allcomma)
  pos<-allcomma[rownum]
  pos <- as.numeric(pos)
  extractions<-str_sub(terms,pos+1)
  extractions<-str_trim(extractions)
  #return(extractions[[1]])
  }
  return(extractions)
}


#统一调用以上函数(每条记录的国家对应每条记录的年份)

wos.items.countries <- function(items) {

    uts <- vector()
    years <- vector()
    countries <- vector()

    for (i in seq_along(items[, "C1"])) {
        line = items[i, "C1"]

        if (length(line)>0) {

            year <- as.integer(items[i, "PY"])

            line <- wos.string.replace(line,";","#")

            addresses <- wos.item.addresses(line)

            extraction <- wos.item.countries(addresses)

            extractions <- c(extraction)
            years <- c(years, rep(year, times = length(addresses)))
        }
    }
    countries = data.frame(extractions, years, stringsAsFactors = FALSE)
    colnames(countries) <- c("country", "year")
    return(countries)

}

这段程序有一些问题,比如:

1、运行后出现
Error in stri_locate_all_regex(string, pattern, omit_no_match = TRUE,  :
  argument `str` should be a character vector (or an object coercible to)

我把样本数据上传至附件,希望能够得到解答。
无限感谢!要是我的问题或者要求没说清楚,请告知我,我补充或者改正。
savedrecs.txt (1.63 MB)

关键词:Science 数据文件 SCIE WEB NCE

沙发
qwirt 发表于 2022-7-2 08:58:22
我也遇到了相同的问题,请问楼主解决了吗

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-8 08:16