形式のテキストに"12,34,77"
、引用符を含む文字列があります。
これらの各数値の値をリストに入れる必要があります。私は使っlapply
てみましたstrsplit
:
control2=lapply(strsplit(data$values,","),as.numeric)
しかし、私はエラーが発生します:
文字以外の引数
私は何を間違っていますか?
1) ストラップ
1a) スカラーstrapply
gsubfn パッケージから使用するワンライナーを次に示します。
library(gsubfn)
x <- '"12,34,567"'
strapply(x, "\\d+", as.numeric, simplify = c)
## [1] 12 34 567
1b) ベクトル化 ベクトル化されたバージョンはさらに単純です。次のsimplify=c
ように削除するだけです。
v <- c('"1,2,3"', '"8,9"') # test data
strapply(v, "\\d+", as.numeric)`
2) gsub とスキャン
2a) スカラーgsub
で、ここではandを使用した 1 線形scan
です。
scan(text = gsub('"', '', x), what = 0, sep = ",")
## Read 3 items
## [1] 12 34 567
2b) ベクトル化 ベクトル化されたバージョンにはlapply
、コンポーネントの -ingが含まれます。
lapply(v, function(x) scan(text = gsub('"', '', x), what = 0, sep = ","))
3) スプリット
3a)スカラーで、これがstrsplit
解決策です。"
と の両方で分割することに注意してください,
。
as.numeric(strsplit(x, '[",]')[[1]][-1])
## [1] 12 34 567
3b) ベクトル化された ベクトル化されたソリューションには、lapply
コンポーネントの -ing が含まれます。
lapply(v, function(x) as.numeric(strsplit(x, '[",]')[[1]][-1]))
3c) ベクトル化 - 単純化またはわずかに単純化:
lapply(strsplit(gsub('"', '', v), split = ","), as.numeric)
あなたの問題は、ソースデータに起因する可能性があると思います。いずれにせよ、数字を扱いたい場合は、引用符を取り除く必要があります。私はお勧めしgsub
ます。
> x <- '"1,3,5"'
> x
[1] "\"1,3,5\""
> x <- gsub("\"", "", x)
> x
[1] "1,3,5"
> as.numeric(unlist(strsplit(x, ",")))
[1] 1 3 5
すでに指摘したように、最初に引用符を正規表現する必要があります。
ライブラリ内のdestring
関数はtaRifx
それを行い (数値以外の文字をすべて削除)、数値に強制します。
test <- '"12,34,77"'
library(taRifx)
lapply(strsplit(test,","),destring)
[[1]]
[1] 12 34 77
これを試して:
x <- "12,34,77"
sapply(strsplit(x, ",")[[1]], as.numeric, USE.NAMES=FALSE)
[1] 12 34 77
の結果はstrsplit()
リストのリストであるため、最初の要素を抽出して に渡す必要がありますlapply()
。
ただし、文字列に埋め込まれた引用符が実際に含まれている場合は、最初に埋め込まれた引用符を削除する必要があります。これに使用できますgsub()
:
x <- '"12,34,77"'
sapply(strsplit(gsub('"', '', x), ",")[[1]], as.numeric, USE.NAMES=FALSE)
[1] 12 34 77