Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于从数据集中删除日期的R-gsub()_R_Regex_Substring_Gsub - Fatal编程技术网

用于从数据集中删除日期的R-gsub()

用于从数据集中删除日期的R-gsub(),r,regex,substring,gsub,R,Regex,Substring,Gsub,我正在使用gsub()函数从数据中删除不需要的文本。我只想把年龄放在括号里,而不是出生日期。然而,这是一个出生日期不同的大型数据集 数据示例: Test1$Age Sep 10, 1990(27) Mar 26, 1987(30 Feb 24, 1997(20) 您可以使用stringr包中的str_extract()执行此操作: s <- "Sep 10, 1990(27)" # get the age in parentheses stringr::str_extract(s,

我正在使用gsub()函数从数据中删除不需要的文本。我只想把年龄放在括号里,而不是出生日期。然而,这是一个出生日期不同的大型数据集

数据示例:

Test1$Age

Sep 10, 1990(27)
Mar 26, 1987(30
Feb 24, 1997(20)

您可以使用
stringr
包中的
str_extract()
执行此操作:

s <- "Sep 10, 1990(27)"

# get the age in parentheses
stringr::str_extract(s, "\\([0-9]+\\)")

# just the age, with parentheses removed
stringr::str_extract(s, "(?<=\\()[0-9]+")
或者,在
tidyverse
符号中:

df <- df %>% mutate(age = stringr::str_extract(age, "\\([0-9]+\\)"))
df%突变(age=stringr::str\u提取(age,“\\([0-9]+\\)”)

似乎有两个问题:

  • 不需要左括号之前的日期
  • 右括号有时缺失,需要插入
  • 1)sub可以使用
    sub
    解决这些问题。匹配

    • 任意数量的字符
      *
      后跟
    • 左括号
      [(]
      后跟
    • 捕获组中的数字
      (\\d+)
      后跟
    • 可选右括号
      [)]?
    然后用左括号替换,匹配到捕获组
    \\1
    和右括号

    没有使用任何软件包

    pat <- ".*[(](\\d+)[)]?"
    transform(test, Age = sub(pat, "(\\1)", Age))
    
    transform(test, Age = sub(")?$", ")", substring(Age, 13))
    
    2)子字符串/sub另一种可能是从第13个字符开始,它给出从左括号到字符串末尾的所有内容,如果缺少,则插入a)
    )?$
    匹配字符串末尾的右括号,如果没有,则仅匹配字符串末尾的右括号。替换为右括号。同样,没有使用包

    pat <- ".*[(](\\d+)[)]?"
    transform(test, Age = sub(pat, "(\\1)", Age))
    
    transform(test, Age = sub(")?$", ")", substring(Age, 13))
    
    如果我们想要一个数字年龄的话,这种方法的一种变体是从第14个字符中提取所有字符,并删除最后一个字符(如果有)

    transform(test, Age = as.numeric(sub(")", "", substring(Age, 14))))
    
    3)读取.table使用
    read.table
    读取带有
    sep=“(“
    comment.char=“)”
    Age
    字段,并选择第二列读取内容。这将给出数字年龄,我们可以使用
    sprintf
    将其用括号括起来。如果
    Age
    是字符(与因子相反),那么
    as.character(Age)
    可以选择性地写成
    Age

    同样,没有使用包。这个不使用正则表达式

    transform(test, Age = 
      sprintf("(%s)", read.table(text = as.character(Age), sep = "(", comment.char = ")")$V2)
    
    注:可复制形式的输入为:

    test <- data.frame(Age = c("Sep 10, 1990(27)", "Mar 26, 1987(30", "Feb 24, 1997(20)"))
    

    test
    gsub('\\([0-9]+)\\),'\\1',x)
    为Michael干杯,但这只是去掉了括号,忘记了我的
    *
    test <- data.frame(Age = c("Sep 10, 1990(27)", "Mar 26, 1987(30", "Feb 24, 1997(20)"))