1

lapplyデータフレーム内の文字列を分割しようとしています。文字列はすべて に似てい"02D_48M_RHD"ます。「D」の前と「M」の前の数字を取得しようとしています。

私の使用はlapplyうまくいっているようです:

a <- lapply(res$description, strsplit, split="[DM]_", fixed=FALSE)

> a[[1]]
[[1]]
[1] "02"  "48"  "RHD"

ただし、私の人生では、a [ 1 ] のベクトルの最初の要素だけにアクセスする方法を理解することはできません。ドキュメントa[[1]][1]は、最初の要素を提供する必要があることを示唆していますが、これが起こることです:

> a[[1]][1]
[[1]]
[1] "02"  "48"  "RHD"

これが機能しない理由がわかりません。R は、これがベクトルであると教えてくれますが、長さが 1 であるとも言っています。

> is.vector(a[[1]])
[1] TRUE
> length(a[[1]])
[1] 1

何を誤解しているのかわかりません。私lapplyが期待する以外の方法で出力を提供していますか? 長さ 3 のベクトルのリストを期待すると、そのようになります。または、それは私が得ているものですが、間違ってアクセスしようとしていますか?

最終的には、これらの情報ごとに 1 つずつ、3 つの列をデータ フレームに追加したいので、その方向に進むのに役立つものは何でも大歓迎です。

4

3 に答える 3

2

strsplitはすでにベクトルで機能しているため、lapplyを呼び出す必要はないと思います。このようなものが役立つかもしれません:

a <- "02D_48M_RHD"
#Create a vector of values to splot
aa <- c(a,a,a,a,a,a,a)
#rbind them together and make a data.frame
> data.frame(do.call("rbind", strsplit(aa, split="[DM]_", fixed=FALSE)))

  X1 X2  X3
1 02 48 RHD
2 02 48 RHD
3 02 48 RHD
4 02 48 RHD
5 02 48 RHD
6 02 48 RHD
7 02 48 RHD
于 2012-01-26T18:43:43.640 に答える
2

strsplitはすでにベクトル化されているため、 でラップする必要はありませんlapplyaベクトルのリストではなく、ベクトルのリストのリストであるため、混乱しています。つまり、それ自体a[[1]]がベクトルを含む 1 要素のリストです。

また、リストは「ベクトル」です。そのため、is.vectorが返されますTRUEis.character返すべきFALSEです。

次のようなものが必要です。

splits    <- strsplit(res$description, "[DM]_", fixed=FALSE)
res$one   <- sapply(splits, "[", 1)
res$two   <- sapply(splits, "[", 2)
res$three <- sapply(splits, "[", 3)
于 2012-01-26T18:38:03.987 に答える
1
 x=c('02D_48M_RHD', '34D_98M_AHR')


> lapply(x,strsplit,split='[DM]_',fixed=F)
[[1]]
[[1]][[1]]
[1] "02"  "48"  "RHD"


[[2]]
[[2]][[1]]
[1] "34"  "98"  "AHR"

これは厄介なネストされたリストになります。あなたが望むのは次のとおりだと思います:

> lapply(strsplit(x,split='[DM]_',fixed=F),'[',1)
[[1]]
[1] "02"

[[2]]
[1] "34"
于 2012-01-26T18:41:36.403 に答える