15

v1 と呼ばれる変数に文字列があります。この文字列は画像番号を示し、「Pic 27 + 28」の形式をとります。最初の数値を抽出し、item という新しい変数に格納します。

私が試したいくつかのコードは次のとおりです。

item <- unique(na.omit(as.numeric(unlist(strsplit(unlist(v1),"[^0-9]+")))))

次のリストにたどり着くまで、これはうまくいきました:

[1,] "Pic 26 + 25"
[2,] "Pic 27 + 28"
[3,] "Pic 28 + 27"
[4,] "Pic 29 + 30"
[5,] "Pic 30 + 29"
[6,] "Pic 31 + 32"

この時点で、他の一意の番号 (25) も取得しているため、必要以上の番号を取得しています。

実際にgsubでやってみましたが、何もうまくいきませんでした。助けていただければ幸いです。

4

5 に答える 5

12

各文字列の 2 つの数字の最初の数字を抽出したいとします。

stringiパッケージのstri_extract_first_regex関数を使用できます。

library(stringi)
stri_extract_first_regex(c("Pic 26+25", "Pic 1,2,3", "no pics"), "[0-9]+")
## [1] "26" "1"  NA  
于 2014-04-27T12:23:01.850 に答える
6

以下の応答では、このテスト データを使用します。

# test data
v1 <- c("Pic 26 + 25", "Pic 27 + 28", "Pic 28 + 27", "Pic 29 + 30", 
"Pic 30 + 29", "Pic 31 + 32")

1) gsubfn

library(gsubfn)

strapply(v1, "(\\d+).*", as.numeric, simplify = c)
## [1] 26 27 28 29 30 31

2) sub これはパッケージを必要としませんが、少し長い正規表現を含みます:

as.numeric( sub("\\D*(\\d+).*", "\\1", v1) )
## [1] 26 27 28 29 30 31

3) read.table これには、正規表現やパッケージは含まれません。

read.table(text = v1, fill = TRUE)[[2]]
## [1] 26 27 28 29 30 31

この特定の例では、fill=TRUEを省略できますが、 のコンポーネントv1のフィールド数が異なる場合は必要になる場合があります。

于 2014-04-27T15:51:50.007 に答える
1

あなたのstrsplit試みをフォローアップするには:

# split the strings
l <- strsplit(x = c("Pic 26 + 25", "Pic 27 + 28"), split = " ")
l
# [[1]]
# [1] "Pic" "26"  "+"   "25" 
# 
# [[2]]
# [1] "Pic" "27"  "+"   "28" 

# extract relevant part from each list element and convert to numeric
as.numeric(lapply(l , `[`, 2))
# [1] 26 27
于 2014-04-27T13:19:42.670 に答える