[英]R - gsub() for to remove dates from data set
我正在使用gsub()函數從數據中刪除不需要的文本。 我只想把年齡放在括號內,而不是出生日期。 但是,這是在具有不同出生日期的大型數據集中。
數據示例:
Test1$Age
Sep 10, 1990(27)
Mar 26, 1987(30
Feb 24, 1997(20)
您可以使用stringr
包中的str_extract()
進行此stringr
:
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]+")
輸出為:
> s <- "Sep 10, 1990(27)"
>
> # get the age in parentheses
> stringr::str_extract(s, "\\([0-9]+\\)")
[1] "(27)"
>
> # just the age, with parentheses removed
> stringr::str_extract(s, "(?<=\\()[0-9]+")
[1] "27"
第一個正則表達式匹配包含一個或多個數字的成對括號。 第二個正則表達式使用正向后括號來匹配括號后的一個或多個數字。
如果您的數據位於data.frame df
,其列名為age
,則可以執行以下操作:
df$age <- stringr::str_extract(df$age, "\\([0-9]+\\)")
或者,以tidyverse
表示法:
df <- df %>% mutate(age = stringr::str_extract(age, "\\([0-9]+\\)"))
似乎有兩個問題:
1)sub這些可以通過sub
解決。 比賽
.*
后跟 [(]
后跟 (\\\\d+)
數字,后跟 [)]?
然后將其替換為左括號,與捕獲組\\\\1
的匹配項和右括號。
不使用任何軟件包。
pat <- ".*[(](\\d+)[)]?"
transform(test, Age = sub(pat, "(\\1)", Age))
相反,如果您希望使用年齡作為數字字段,則:
transform(test, Age = as.numeric(sub(pat, "\\1", Age)))
2)substring / sub另一個可能的方法是從第13個字符開始,該字符給出從左括號到字符串末尾的所有內容,如果缺少則插入a)。 )?$
在字符串的末尾匹配右括號,如果沒有則僅匹配字符串的末尾。 替換為右括號。 同樣,不使用任何軟件包。
transform(test, Age = sub(")?$", ")", substring(Age, 13))
如果我們希望使用數字Age作為替代,則可以采用第14個字符中的所有內容,如果有的話,則刪除最后一個)。
transform(test, Age = as.numeric(sub(")", "", substring(Age, 14))))
3)read.table使用read.table
來讀取sep = "("
和comment.char = ")"
的Age
字段,並選擇第二列read。 這將給出數字年齡,我們可以使用sprintf
用括號將其括起來。 如果Age
是字符(而不是factor),那么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)"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.