Yanıtlar:
R tabanındaki hiçbir şeyin farkında değilim, ancak bunu kullanarak substr
ve bunu kullanarak bir işlev yapmak basittir nchar
:
x <- "some text in a string"
substrRight <- function(x, n){
substr(x, nchar(x)-n+1, nchar(x))
}
substrRight(x, 6)
[1] "string"
substrRight(x, 8)
[1] "a string"
Bu, mdsumner'ın işaret ettiği gibi vectorizedir. Düşünmek:
x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
nchar(x)
Yerel bir değişkene atayarak iki kez çağrı yapmaktan kaçınmak daha verimli olur mu?
stringr
Paketi kullanmanın sakıncası yoksa str_sub
kullanışlıdır, çünkü geriye doğru saymak için negatifleri kullanabilirsiniz:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Veya Max'in bu cevaba yaptığı bir yorumda belirttiği gibi,
str_sub(x, start= -6)
[1] "string"
stringr
olarak yeniden yapılmış olduğuna inanıyorum stringi
, bu yüzden şimdi NA'lar ile çalışması gerekir.
Paketteki stri_sub
işlevi kullanın stringi
. Alt dizeyi sondan almak için negatif sayılar kullanın. Örnekler için aşağıya bakın:
stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"
Bu paketi github'dan yükleyebilirsiniz: https://github.com/Rexamine/stringi
Şimdi CRAN'da kullanılabilir, sadece şunu yazın
install.packages("stringi")
Bu paketi yüklemek için.
Bir diğer makul yol da düzenli ifadeler kullanmak ve sub
:
sub('.*(?=.$)', '', string, perl=T)
Yani, "her şeyden sonra tek bir karakterden kurtulun". Sonunda daha fazla karakter almak için, ileriye bakın beyanında birçok nokta ekleyin:
sub('.*(?=.{2}$)', '', string, perl=T)
nerede .{2}
araçlar ..
böylece anlam veya "herhangi iki karakter", "her şeyi kurtulmak iki karakter tarafından takip".
sub('.*(?=.{3}$)', '', string, perl=T)
üç karakter, vb. için. Bir değişkenle yakalanacak karakter sayısını ayarlayabilirsiniz, ancak paste
değişken ifade için normal ifade dizesine girmeniz gerekir :
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
GÜNCELLEME : mdsumner tarafından belirtildiği gibi , alt kod olduğu için orijinal kod zaten vektörleştirilmiştir. Daha dikkatli olmalıydım.
Ve vektörleştirilmiş bir sürüm istiyorsanız ( Andrie'nin koduna göre)
substrRight <- function(x, n){
sapply(x, function(xx)
substr(xx, (nchar(xx)-n+1), nchar(xx))
)
}
> substrRight(c("12345","ABCDE"),2)
12345 ABCDE
"45" "DE"
Ben değişti unutmayın (nchar(x)-n)
etmek (nchar(x)-n+1)
için n
karakterleri.
(nchar(x)-n)
için (nchar(x)-n+1)
"
substring()
Fonksiyonu kullanan basit bir temel R çözümü (bu fonksiyonun var olduğunu kim bilebilirdi?):
RIGHT = function(x,n){
substring(x,nchar(x)-n+1)
}
Bu temelde substr()
altta olma avantajından yararlanır, ancak varsayılan bitiş değeri 1.000.000'dir.
Örnekler:
> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
Alternatifi substr
, dizeyi tek bir karakter listesine ayırmak ve aşağıdakileri işlemektir:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Ben de kullanıyorum substr
ama farklı bir şekilde. "Bana yemeğini ver" in son 6 karakterini çıkarmak istiyorum. İşte adımlar:
(1) Karakterleri böl
splits <- strsplit("Give me your food.", split = "")
(2) Son 6 karakteri ayıkla
tail(splits[[1]], n=6)
Çıktı:
[1] " " "f" "o" "o" "d" "."
Karakterin her birine erişilebilir splits[[1]][x]
, burada x 1 ila 6'dır.
daha önce birisi benim için benzer bir çözüm kullanıyor, ancak aşağıdaki gibi düşünmeyi daha kolay buluyorum:
> text<-"some text in a string" # we want to have only the last word "string" with 6 letter
> n<-5 #as the last character will be counted with nchar(), here we discount 1
> substr(x=text,start=nchar(text)-n,stop=nchar(text))
Bu, son karakterleri istediğiniz gibi getirir.
Bir dize son karakteri almak için aşağıdaki kodu kullandım.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Son birkaç karakteri nasıl alacağınızı öğrenmek için nchar (stringOfInterest) ile oynayabilirsiniz.
@Andrie çözümü üzerinde küçük bir değişiklik de tamamlayıcıyı verir:
substrR <- function(x, n) {
if(n > 0) substr(x, (nchar(x)-n+1), nchar(x)) else substr(x, 1, (nchar(x)+n))
}
x <- "moSvmC20F.5.rda"
substrR(x,-4)
[1] "moSvmC20F.5"
Aradığım şey buydu. Ve sol tarafa davet ediyor:
substrL <- function(x, n){
if(n > 0) substr(x, 1, n) else substr(x, -n+1, nchar(x))
}
substrL(substrR(x,-4),-2)
[1] "SvmC20F.5"