6

文字列を持っていて、最後の桁で分割し、分割された hpw の最後の部分を保持したい場合、それはできますか?

x <- c("ID", paste0("X", 1:10, state.name[1:10]))

私は…したい

 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

しかし、次のように解決します。

 [1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

最初の部分は次の方法で取得できます。

unlist(strsplit(x, "[^0-9]*$"))

でも第二弾が欲しい。

前もって感謝します。

4

4 に答える 4

4

You can do this one easy step with a regular expression:

gsub("(^.*\\d+)(\\w*)", "\\2", x)

Results in:

 [1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"    "California"  "Colorado"    "Connecticut"
 [9] "Delaware"    "Florida"     "Georgia"  

What the regex does:

  1. "(^.*\\d+)(\\w*)": Look for two groups of characters.
    • The first group (^.*\\d+) looks for any digit followed by at least one number at the start of the string.
    • The second group \\w* looks for an alpha-numeric character.
  2. The "\\2" as the second argument to gsub() means to replace the original string with the second group that the regex found.
于 2012-05-24T09:01:05.237 に答える
2

gsubfn

このgsubfnソリューションを試してください:

> library(gsubfn)
> strapply(x, ".*\\d(\\w*)|$", ~ if (nchar(z)) z else NA, simplify = TRUE)
 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

最後の数字とそれに続く単語文字に一致し、単語文字を返すか、それが失敗した場合は行末に一致します (何かに一致することを確認するため)。最初の一致が成功した場合は、それを返します。それ以外の場合、後方参照は空になるため、NA を返します。

数式は関数を簡単に記述する方法でfunction(z) if (nchar(z)) z else NAあり、その関数は代わりに数式を置き換えることができますが、キーストロークがわずかに増えることに注意してください。

gsub

同様の戦略は、ストレートのみを使用して機能することもできますgsubが、2 つの行とわずかに複雑な正規表現が必要です。ここでは、2 番目の選択肢を使用して、最初の選択肢から不一致を丸呑みします。

> s <- gsub(".*\\d(\\w*)|.*", "\\1", x)
> ifelse(nchar(s), s, NA)
 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

編集:マイナーな改善

于 2012-05-24T12:12:37.260 に答える
2

これは少し不格好に思えますが、動作します:

state.pt2 <- unlist(strsplit(x,"^.[0-9]+"))
state.pt2[state.pt2!=""]

""文字列の先頭にある一致によって生成された 'sを削除するといいのですが、それがわかりません。

結果をサブセット化する必要を回避するsubstrand too を使用する別の方法を次に示します。gregexpr

substr(x,unlist(lapply(gregexpr("[0-9]",x),max))+1,nchar(x))
于 2012-05-24T06:16:24.283 に答える
2
library(stringr)
unlist(lapply(str_split(x, "[0-9]"), tail,n=1))

与える

[1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"    "California"  "Colorado"    "Connecticut" "Delaware"   
[10] "Florida"     "Georgia"

stringr(おそらく)さらに優れたアプローチのドキュメントを確認します。

于 2012-05-24T06:08:55.863 に答える