5

'aaa_9999_1' の形式のデータ ベクトルがあります。最初の部分はアルファ ロケーション コード、2 番目は 4 桁の年、最後は一意のポイント識別子です。たとえば、複数の sil_2007_X ポイントがあり、それぞれ最後の桁が異なります。「_」文字を使用してこのフィールドを分割し、一意の ID 番号のみを新しいベクトルに保存する必要があります。私は試した:

oss$point <- unlist(strsplit(oss$id, split='_', fixed=TRUE))[3]

ここでの応答に基づいて: R remove part of string . 「1」の単一の応答が得られます。走るだけなら

strsplit(oss$id, split= ‘_’, fixed=TRUE)

分割リストを生成できます。

> head(oss$point)
[[1]]
[1] "sil"  "2007" "1"   

[[2]]
[1] "sil"  "2007" "2"   

[[3]]
[1] "sil"  "2007" "3"   

[[4]]
[1] "sil"  "2007" "4"   

[[5]]
[1] "sil"  "2007" "5"   

[[6]]
[1] "sil"  "2007" "6"  

最後に [3] を追加すると、[[3]] という結果が得られます: 「sil」「2007」「3」。私が欲しいのは、すべてのレコードの 3 番目の部分 (一意の番号) のベクトルです。これについては理解に近づいているように感じますが、締め切りのプロジェクトに時間がかかりすぎています (ほぼ 1 日)。フィードバックをお寄せいただきありがとうございます。

4

2 に答える 2

16

strsplitリストを作成するので、次のことを試してみます。

lapply(strsplit(oss$id, split='_', fixed=TRUE), `[`, 3) ## Output a list
sapply(strsplit(oss$id, split='_', fixed=TRUE), `[`, 3) ## Output a vector (even though a list is also a vector)

3 番目の[要素を抽出する手段。ベクトルを使用する場合は、 に置き換えlapplysapplyください。

次に例を示します。

mystring <- c("A_B_C", "D_E_F")

lapply(strsplit(mystring, "_"), `[`, 3)
# [[1]]
# [1] "C"
# 
# [[2]]
# [1] "F"
sapply(strsplit(mystring, "_"), `[`, 3)
# [1] "C" "F"

簡単に定義できるパターンがある場合は、それもgsub良いオプションであり、分割を回避します。DWin と Josh O'Brien からの同じ方針に沿った改善された (より堅牢な) バージョンのコメントを参照してください。

gsub(".*_.*_(.*)", "\\1", mystring)
# [1] "C" "F"

そして最後に、楽しみのために、s とs のunlistベクトルを再利用して 3 つおきの項目を抽出することにより、このアプローチを拡張して機能させることができます (すべての分割が同一の構造になることが事前にわかっているため)。TRUEFALSE

unlist(strsplit(mystring, "_"), use.names = FALSE)[c(FALSE, FALSE, TRUE)]
# [1] "C" "F"

数値の位置ではなく、区切り記号の後の最後の値を抽出するだけの場合は、いくつかの選択肢があります。

貪欲な正規表現を使用します。

gsub(".*_(.*)", "\\1", mystring)
# [1] "C" "F"

stri_extract*「stringi」パッケージのような便利な関数を使用します:

library(stringi)
stri_extract_last_regex(mystring, "[A-Z]+")
# [1] "C" "F"
于 2013-10-16T17:47:12.127 に答える
0

これはあなたが必要とするものですか?

x = c('aaa_9999_12', 'bbb_9999_20')
ids = sapply(x, function(v){strsplit(v, '_')[[1]][3]}, USE.NAMES = FALSE)

# optional
# ids = as.numeric(ids)

これは非常に非効率的です。おそらくもっと良い方法があります。

于 2013-10-16T17:48:50.090 に答える