No.22097 R 文字列の分割 strsplit()関数  【明石】 2016/08/10(Wed) 22:00

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

Rプログラムについて,ご教示いただきたいことが出てきました。
どうぞ,よろしくお願いいたします。

−−−

文字列"_"で連結した文字列ベクトル dat があります(膨大な長さ)。

(例)dat
"123_aaa"
"4567_bbbb"
"787_ccc"
"12345_ddddd"
"56787_boeing"
,,,,,,
やりたいことは,以下の通りです。

(1) まず,文字列"_"の左右で分割して,2つのベクトルを作成します。

  左側のベクトル名を lhs とします。データ型は整数
  (例) 
      123,4567,787,12345,56787,,,,,
  右側のベクトル名を rhs とします。データ型は文字列
  (例) 
      "aaa","bbbb","ccc","ddddd","boeing",,,,,
(2) 次に,lhs,rhsの2列からなるデータフレーム(変数名は df )を作成したいと思います。
lhs,rhs
123,"aaa"
4567,"bbbb"
787,"ccc"
12345,"ddddd"
56787,"boeing"
,,,,,,
以下,トライしてみましたが,listに負慣れなために出来ないで苦慮しております。
dat <- c("123_aaa","4567_bbbb","787_ccc","12345_ddddd","56787_boeing")

ds <- strsplit(dat, "_")
ds が listになることは分かりましたが,listは負慣れなために,要素の取り出しができないでおります。

要素の取り出しができ,lhsベクトル,rhsベクトルを生成できれば,データフレーム df を作成することができます。

上記の手順に沿って,データフレーム df までを作成するRプログラムを,ご教示いただければ,
大変に助かります。

何卒どうぞ,よろしくお願いいたします。
失礼いたします。

No.22098 Re: R 文字列の分割 strsplit()関数  【青木繁伸】 2016/08/11(Thu) 08:26

リストを取り出すのは [[ ]] です
> ds[1]
[[1]]
[1] "123" "aaa"

> ds[2]
[[1]]
[1] "4567" "bbbb"

> ds[[2]]
[1] "4567" "bbbb"
> ds[[2]][1]
[1] "4567"
> ds[[2]][2]
[1] "bbbb"
リストのまま処理することもできますけど,strsplit の戻り値を unlist すれば 1 つのベクトルになります。
> unlist(ds)
[1] "123" "aaa" "4567" "bbbb" "787" "ccc" "12345" "ddddd" "56787"
[10] "boeing"
それ以降はいろいろなやり方があるでしょう。1列目が numeric,2列目は character にしたいというのでちょっと面倒くさいですが。
> dat <- c("123_aaa","4567_bbbb","787_ccc","12345_ddddd","56787_boeing")
> ds <- strsplit(dat, "_")
> x <- unlist(ds)
> f <- rep(c(TRUE, FALSE), length(dat))
> lhs <- as.numeric(x[f])
> rhs <- x[!f]
> df <- data.frame(lhs, rhs, stringsAsFactors=FALSE)
> df
lhs rhs
1 123 aaa
2 4567 bbbb
3 787 ccc
4 12345 ddddd
5 56787 boeing
> sapply(df, class)
lhs rhs
"numeric" "character"
楽しんでください。

No.22099 【御礼】Re: R 文字列の分割 strsplit()関数  【明石】 2016/08/11(Thu) 09:39

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

大変に有難いご教示をいただき,誠にありがとうございました。

今回も,助けていただきました。

listの扱いかたが見えてきましたので,
この夏休み,楽しみながらlistの勉強をさせていただきます。

心から御礼を申し上げます。

No.22103 Re: R 文字列の分割 strsplit()関数  【荒】 2016/08/16(Tue) 12:20

少し遅くなりましたが,
以下のようにしてもデータフレーム化できました。
(簡単なものしか回答できていませんね)
> dat <- c("123_aaa","4567_bbbb","787_ccc","12345_ddddd","56787_boeing")
> ds <- strsplit(dat, "_")

> library(plyr)
> df <- ldply(ds)
> df
     V1     V2
1   123    aaa
2  4567   bbbb
3   787    ccc
4 12345  ddddd
5 56787 boeing

> colnames(df) <- c("lhs","rhs")
> df$lhs <- as.numeric(df$lhs)

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る