No.22900 【R】リストからデータフレームへの変換(その2)  【明石】 2020/04/27(Mon) 17:26

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
毎々,ご丁寧なご教示をいただき,誠にありがとうございます。

先にご教示いただきました, No. 22896 【R】リストからデータフレームへの変換
について,
追加のご教示をいただけましたら,大変に助かります。

毎々,お手数をおかけいたします。
何卒,どうぞよろしくお願いいたします。

----------------------------------------

以下の例題について,
apply系関数を使う,リストからデータフレームへの変換方法を,
ご教示をいただけましたら,大変に助かります。
s <- c("りんご_apple_林檎", "みかん_orange_蜜柑", "バナナ_banana", "メロン_melon")
s <- strsplit(s, "_")
リストに格納された4本のベクトルの要素の個数は,異なります。
> s[[1]]
[1] "りんご" "apple" "林檎"
> s[[2]]
[1] "みかん" "orange" "蜜柑"
> s[[3]]
[1] "バナナ" "banana"
> s[[4]]
[1] "メロン" "melon"
やりたいことを,以下にお示しをします。
> s[[1]][1]
[1] "りんご"
> s[[2]][1]
[1] "みかん"
> s[[3]][1]
[1] "バナナ"
> s[[4]][1]
[1] "メロン"
のように,s[[*]][1]のベクトル要素だけを集めて,ベクトルに格納する。

同様に,
s[[*]][2]のベクトル要素だけを集めて,ベクトルに格納する。
s[[*]][3]のベクトル要素だけを集めて,ベクトルに格納する。

以下のような3本のベクトルを得ることができましたら,データフレームを作成できます。
> x1
[1] "りんご" "みかん" "バナナ" "メロン"
> x2
[1] "apple" "orange" "banana" "melon"
> x3
[1] "林檎" "蜜柑" NA NA
s[[*]][1]のベクトル要素だけを集めて,ベクトルに格納する。
s[[*]][2]のベクトル要素だけを集めて,ベクトルに格納する。
s[[*]][3]のベクトル要素だけを集めて,ベクトルに格納する。
の操作で,もし,apply系関数が利用できるならば,
その方法をご教示いただけましたら助かります。

毎々,お手数をおかけいたします。
何卒,どうぞよろしくお願いいたします。
//

No.22901 Re: 【R】リストからデータフレームへの変換(その2)  【青木繁伸】 2020/04/27(Mon) 22:08

以下のようにすれば,もっともらしいとは思いますが,スマートでもなんでもないと思います。
素直にプログラミングする方がよいかと思います。
s <- c("りんご_apple_林檎", "みかん_orange_蜜柑", "バナナ_banana", "メロン_melon")
v <- sapply(s, function(u) {
str <- character(3)
a <- unlist(strsplit(u, "_"))
len <- length(a)
str[1:len] = a
str})
df <- data.frame(t(v))
rownames(df) <- NULL
df[df==""] <- NA
df
df[,1]
df[,2]
df[,3]
実行結果
> df
X1 X2 X3
1 りんご apple 林檎
2 みかん orange 蜜柑
3 バナナ banana
4 メロン melon
> df[,1]
[1] "りんご" "みかん" "バナナ" "メロン"
> df[,2]
[1] "apple" "orange" "banana" "melon"
> df[,3]
[1] "林檎" "蜜柑" NA NA

No.22902 御礼(Re: 【R】リストからデータフレームへの変換(その2))  【明石】 2020/04/28(Tue) 09:12

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
毎々,ご丁寧なご教示をいただき,誠にありがとうございます。

今回も,ご丁寧で,ありがたいご教示をいただき,とてもうれしいです。
心から,心より,御礼を申し上げます。
ありがとうございました。

以下,補足です。
------------------------------------

s[[*]][1]のベクトル要素だけを集めて,ベクトルに格納する,
という個所を, 例えば,sapply(s, FUN,1)  などのように,

s[[*]][2]のベクトル要素だけを集めて,ベクトルに格納する,
という個所を, 例えば,sapply(s, FUN,2)  などのように,

もし,上記のように書けたとすると(書けるかどうか,その知識がありません) 
FUNは,どのように書けるのか,という強い興味がございました。

投稿の動機が不純だったような気がしており,反省しています。
やはり,プログラミングも,素直さが大切です。
//

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