我一直在使用 gsub 来缩写较长字符串中的单词。我想缩写一个单词,然后尽可能多地继承输入的大写形式。
例如,将 hello 改为 hi:
x <- c("Hello World", "HELLO WORLD", "hello world", "hElLo world")
但请尊重原文中 hello 的大小写
c("Hi World", "HI WORLD", "hi world", "hI world")
我真正想要匹配的大多数示例是“HI”“hi”和“Hi”。我不太关心“hI”,但为了完整起见,我将其保留为一种可能性。
到目前为止,为了完成这项工作,我采用了维护目标和替换字符串向量的繁琐方法
xin <- c("Hello\ ", "HELLO\ ", "hello\ ", "hElLo\ ")
xout <- c("Hi ", "HI ", "hi ", "hI ")
mapply(gsub, xin, xout, x)
这给出了正确的答案,请参阅:
Hello HELLO hello hElLo
"Hi World" "HI WORLD" "hi world" "hI world"
但这很尴尬、耗时且不灵活!到目前为止,我有一个 50 个单词的家族,我们正在寻求缩写,并且保留所有大小写组合很烦人。
这些数据充满了混合大小写的数据困惑,因为人类输入了大约 78000 条记录,并且他们以各种可以想象的方式将“部门”和“大学”等单词大写。他们输入的长句子不适合打印页面上允许的空间,我们被要求将它们缩短为“dept”和“univ”。如果可能的话,我们希望保留大写。
我唯一的想法在我看来不太像 R。拆分原始输入,将前 2 个字母的现有大小写制成表格。
xcap <- sapply(strsplit(x, split = ""), function(x) x %in% LETTERS)[1:2, ]
> t(xcap)
[,1] [,2]
[1,] TRUE FALSE
[2,] TRUE TRUE
[3,] FALSE FALSE
[4,] FALSE TRUE
我非常确定我可以使用该大小写信息来使这项工作正常进行。但我还没有成功。我刚刚意识到 G Grothendieck 的包 gsubfn 可能有用,但其中的术语(“原始”对象)对我来说是新的。
我可能会继续朝这个方向前进,但现在我想问是否有更直接的路线。
pj
最佳答案
你的想法启发了我编写这段代码。它是在一个 sapply block 中完成的。 toupper函数用于将xout字符串的分割字符大写。
x <- c("Hello World", "HELLO WORLD", "hello world", "hElLo world")
sapply(x, function(x,xout) {
xcap<-(unlist(strsplit(unlist(strsplit(x," "))[1],"")) %in% LETTERS)
n<-nchar(xout)
if(length(xcap)>=n) {
xcap<-xcap[1:n]
}else {
xcap<-c(xcap,rep(tail(xcap,1),n-length(xcap)))
}
xout<-paste(sapply(1:n,function(x) {
if(xcap[x]) toupper(unlist(strsplit(xout,""))[x])
else unlist(strsplit(xout,""))[x]
}),sep = "",collapse = "")
xin<-"hello"
gsub(xin,xout,x[1],ignore.case = T)
},xout="selamlar")
[output with "selamlar"]
Hello World HELLO WORLD hello world hElLo world
"Selamlar World" "SELAMLAR WORLD" "selamlar world" "sElAmlar world"
[output with "hi"]
Hello World HELLO WORLD hello world hElLo world
"Hi World" "HI WORLD" "hi world" "hI world"
关于regex - gsub 替换并保留大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32304688/