2011-10-11 20 views
67

Her karaktere farklı değerler atayarak karakter dizileri kullanarak 2 boyutlu yürüyüşler yapmak istiyorum. Bir dizenin ilk karakterini 'pop' etmeyi, kullanmayı ve dizenin geri kalanı için tekrarlamayı planlıyorum.Bir dizenin ilk karakterini alma ve kaldırma

Böyle bir şeye nasıl ulaşabilirim?

x <- 'hello stackoverflow' 

Böyle bir şey yapabilmek istiyorum:

a <- x.pop[1] 

print(a) 

'h' 
print(x) 

'ello stackoverflow' 

cevap

109

?substring bakınız.

x <- 'hello stackoverflow' 
substring(x, 1, 1) 
## [1] "h" 
substring(x, 2) 
## [1] "ello stackoverflow" 

her ikisi de bir değer verir ve x saklanan veri güncelleme bir yan etkiye sahip olan bir pop yöntem fikri çok nesne yönelimli programlama bir kavramdır. Bu nedenle, karakter vektörleri üzerinde çalışmak için pop işlevini tanımlamak yerine, yöntemiyle reference class yapabiliriz.

PopStringFactory <- setRefClass(
    "PopString", 
    fields = list(
    x = "character" 
), 
    methods = list(
    initialize = function(x) 
    { 
     x <<- x 
    }, 
    pop = function(n = 1) 
    { 
     if(nchar(x) == 0) 
     { 
     warning("Nothing to pop.") 
     return("") 
     } 
     first <- substring(x, 1, n) 
     x <<- substring(x, n + 1) 
     first 
    } 
) 
) 

x <- PopStringFactory$new("hello stackoverflow") 
x 
## Reference class object of class "PopString" 
## Field "x": 
## [1] "hello stackoverflow" 
replicate(nchar(x$x), x$pop()) 
## [1] "h" "e" "l" "l" "o" " " "s" "t" "a" "c" "k" "o" "v" "e" "r" "f" "l" "o" "w" 
8

Kullanım stringi paketin

> x <- 'hello stackoverflow' 
> stri_sub(x,2) 
[1] "ello stackoverflow" 
3

bu fonksiyon kaldırarak birinci karakterler:

x <- 'hello stackoverflow' 
substring(x, 2, nchar(x)) 

Fikir tüm karakterlerin x karakter sayısı 2'den başlayarak seçme olduğunu. Bu, kelime veya ifadedeki eşit sayıda karaktere sahip olduğunuzda önemlidir.

substring(x,1,1) 
6

substring kesinlikle en iyisi, ama henüz görmemiştim beri burada, bir strsplit alternatiftir:

ilk harfini seçilmesi önceki cevaplar olarak önemsiz olduğunu.

> x <- 'hello stackoverflow' 
> strsplit(x, '')[[1]][1] 
## [1] "h" 

veya eşdeğer

> unlist(strsplit(x, ''))[1] 
## [1] "h" 

Ve yeniden bir araya dize kalanını paste edebilirsiniz.

> paste0(strsplit(x, '')[[1]][-1], collapse = '') 
## [1] "ello stackoverflow" 
4

x <- 'hello stackoverflow' 
str_sub(x, 2) # or 
str_sub(x, 2, str_length(x)) 
[1] "ello stackoverflow" 
1

diğer alternatif düzenli ifade fonksiyonları regmatches ve regexec ile yakalayan alt ifadeleri kullanmaktır stringr paketinden de str_sub yoktur.

# the original example 
x <- 'hello stackoverflow' 

# grab the substrings 
myStrings <- regmatches(x, regexec('(^.)(.*)', x)) 

Bu list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))) eşdeğerdir uzunluğu 1.

myStrings 
[[1]] 
[1] "hello stackoverflow" "h"     "ello stackoverflow" 

listesinde tüm dizeyi ilk karakterini ve "attı" sonucunu verir.Yani, istenen dizinin yanı sıra tam dizinin süper setini içerir.


sapply ekleme bu yöntem bu ilk unsur olarak eşleştirilmiş tam dize ve yakaladığı eşleşen subexpressions olan bir liste döndürür> 1.

# a slightly more interesting example 
xx <- c('hello stackoverflow', 'right back', 'at yah') 

# grab the substrings 
myStrings <- regmatches(x, regexec('(^.)(.*)', xx)) 

uzunlukta bir karakter vektörü için çalışmasını sağlayacak Aşağıdaki öğeler olarak (). Yani '(^.)(.*)' düzenli ifadesinde, (^.) ilk karakterle eşleşir ve (.*) kalan karakterlerle eşleşir.

myStrings 
[[1]] 
[1] "hello stackoverflow" "h"     "ello stackoverflow" 

[[2]] 
[1] "right back" "r"   "ight back" 

[[3]] 
[1] "at yah" "a"  "t yah" 

Şimdi, istenilen alt dizeleri çekmeyi güvenilir sapply + [ yöntemi kullanabilirsiniz.

myFirstStrings <- sapply(myStrings, "[", 2) 
myFirstStrings 
[1] "h" "r" "a" 
mySecondStrings <- sapply(myStrings, "[", 3) 
mySecondStrings 
[1] "ello stackoverflow" "ight back"   "t yah" 
+0

Bu çok hoş bir hile ama bence bu soruyu özlüyor. – pedrosaurio

+0

Diğer cevaplarla aynı çıktıyı üretebildiğinden daha fazla açıklamanız gerekecek. Ekstraksiyon için "sapply" kullanan son kod bloğuna bakın. İlk karakterin "haşhaş", soruda belirtildiği gibi, bu işlemin sonuçta oluşan vektör üzerinde yinelenmesidir (mySecondStrings). – lmo

+0

Sadece eklediğiniz ek açıklama ile çalışır, ancak yine de olması gerekenden daha kıvrımlı buluyorum. – pedrosaurio

İlgili konular