質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • R

    320questions

    R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

  • Mecab

    178questions

    Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Rで、listのnames属性を取得したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 228

hacosato

score 24

Rで、listのnames属性を取得して、あたらしいベクトルを作りたいです!

library(RMeCab)

(word <- RMeCabC("いつも答えてくれてありがとう"))


これをすると、

[[1]]
    副詞 
"いつも" 

[[2]]
  動詞 
"答え" 

[[3]]
助詞 
"て" 

[[4]]
  動詞 
"くれ" 

[[5]]
助詞 
"て" 

[[6]]
      感動詞 
"ありがとう" 


こういう結果が返ってきます(意図通り)。
これを使って、

mylist <- c("いつも_副詞", "答え_動詞", "て_助詞", "くれ_動詞", "て_助詞", "ありがとう_感動詞")


となるようなベクトルを作りたいです(最終目標)。

names属性をlistで得られれば、あとはmylist <- paste(word, word.names, sep = "_")
みたいなやつをやればいいとおもうので、names属性を取得したいです。やりかたがわかりません…。

「names(word)」かとおもいましたが、NULLが返ってきてしまうのどうしてでしょうか…?

追加 2018/06/18 17:30

str(word)すると、以下のようになります。これはどのように読んだらよいものでしょうか…?

List of 6
 $ : Named chr "いつも"
  ..- attr(*, "names")= chr "副詞"
 $ : Named chr "答え"
  ..- attr(*, "names")= chr "動詞"
 $ : Named chr "て"
  ..- attr(*, "names")= chr "助詞"
 $ : Named chr "くれ"
  ..- attr(*, "names")= chr "動詞"
 $ : Named chr "て"
  ..- attr(*, "names")= chr "助詞"
 $ : Named chr "ありがとう"
  ..- attr(*, "names")= chr "感動詞"

names(word[[1]])すると、以下のようになります。いい線いってると思うんですが…。

[1] "副詞"

でもnames(word)するとNULLになってしまいます…。

追加 2018/06/19 20:50

result <- list()
for (i in 1:length(word)) {
  (val <- names(word[[i]]))
  result <- append(result, val)
}


このようにして、品詞名のリストを手にすることができました!!
しかし、いまだに本質を理解することができていない気がします…。

lapply(word, "[[", names)


こんな感じでapply使って、達成できそうだと思ったんですが…。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

RMeCabは持っていないので、マニュアルを通読したのみによる推測ですが、次のような形でできませんか?

word_unlist <- unlist(word)
mylist <- paste(word_unlist, names(word_unlist), sep="_")

RMeCabCなるものがどんな構造のデータを返してくるかは、str(word)などとして眺めてみるといいと思います。

 追加 2018/06/18 17:30をうけて追記

乗りかかった舟で、手元のcentOSにRMeCabをインストールして眺めてみました。「リストが入れ子」とした推測は事実ではありませんでした。しかし回答者さんの認識もおそらく正確ではありません。

多分回答者さんは、MeCabCが吐き出したlistであるwordの構造を次のようにとらえておられると思います。

リストの要素(単語) 名前(品詞)
1 いつも 副詞
2 答え 動詞
3 助詞
4 くれ 動詞
5 助詞
6 ありがとう 感動詞

しかし正確には、次のようになっているのですね。

リストの要素
1 1番目の単語に対応する名前付きベクトル
2 2番目の単語に対応する名前付きベクトル
3 3番目の単語に対応する名前付きベクトル
... ...

ややこしいのですが、名前はwordを構成する6個の要素についているのではないのですね。

したがって、names(word)では品詞名は習得できません。しかし、names(word[[1]])とすれば副詞と返ってくるはずです。

ではここで、ちょっといたずらをしてみます。

names(word) <- c("fukushi", "doushi", "joshi", "doushi", "joshi", "kandoushi")


str(word)を見てみましょう。

List of 6
 $ fukushi  : Named chr "いつも"
  ..- attr(*, "names")= chr "副詞"
 $ doushi   : Named chr "答え"
  ..- attr(*, "names")= chr "動詞"
 $ joshi    : Named chr "て"
  ..- attr(*, "names")= chr "助詞"
 $ doushi   : Named chr "くれ"
  ..- attr(*, "names")= chr "動詞"
 $ joshi    : Named chr "て"
  ..- attr(*, "names")= chr "助詞"
 $ kandoushi: Named chr "ありがとう"
  ..- attr(*, "names")= chr "感動詞"

「リストの要素に名前がついている」のと「名前付きベクトルが要素になっている」の違いが分かるのではないでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/17 13:59

    ありがとうございました! きちんと動きました。namesはlistでもベクトルでも効くという認識でしたが、どうしてlistだとうまくいかなくてベクトルにするとうまくいくのでしょうか…。

    キャンセル

  • 2018/06/17 14:43

    リストが入れ子になっていたりしませんか。str(word)で確認できると思いますが。

    キャンセル

  • 2018/06/18 17:31

    遅くなってしまいすみません。コメントありがとうございます。str(word)の結果を追記しました。names(word[[1]])の結果などからこれは入れ子ではないと思ったんですがそんなことないでしょうか…?

    キャンセル

  • 2018/06/19 20:58

    わざわざありがとうございます。
    ヒントをご提示いただいたのだと認識しました💡

    “いたずら”の結果、namesがリストの要素そのものに対して付与されたのは理解できました!
    そしてそれは、わたしが手に入れようとしているのとは別物だということもわかりました。
    しかし、names(word[[1]])なる操作で手に入るものがなんなのかまだわかりません…。

    Pythonでいうところの内包表記みたいなことをすればうまくいきそうだと思ったので、
    Rでならapplyを使って、unlistしなくともnamesが手に入る方法があると思ったのですが、
    そんなことはないでしょうか…。
    できの悪い生徒ですみません……。

    キャンセル

  • 2018/06/20 03:22

    word[[1]]で参照されるのは、リストの要素、つまりここでは「個々の名前付きベクトル」です。したがってnames(word[[1]])で名前付きベクトルの名前、すなわち品詞名が取得できます。
    apply系関数は、リストの要素をひとつづつ取り出しては所定の関数に与える機能を持ちます。lapply(word, "[[", names)では、リストの要素についてさらに[[で要素を取り出す形になりますからダメです。
    品詞をベクトルとして取り出したければsapply(word, names)で充分です。
    ついでに最終目的までやってしまうなら、sapply(word, function(x){paste(x, names(x), sep="_")})でいいでしょう。

    キャンセル

  • 2018/06/20 10:53

    大変ありがとうございました…迷走したのに結果はシンプル…!!
    「最終目的までやってしまうなら」は無名関数ですよね…自分で使いこなせるまでいってないのでお勉強します。
    このたびは長らくお付き合いいただきほんとうにありがとうございました!

    キャンセル

0

得たい結果のかたちが

> str(result)
List of 6
 $ : chr "副詞"
 $ : chr "動詞"
 $ : chr "助詞"
 $ : chr "動詞"
 $ : chr "助詞"
 $ : chr "感動詞"


ということなら、以下でどうでしょうか。

result <- unname(sapply(word, attributes))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/20 10:55

    ありがとうございました! attributesっていうのもnamesみたいに使えるんですね💡
    知らないことばかりで勉強になります。
    apply関係、まだぜんぜん使いこなせないので、ごくカンタンなことしかできません。お勉強します。
    向こうもこちらも、たくさんの質問にお付き合いいただきありがとうございます!

    キャンセル

関連した質問

同じタグがついた質問を見る

  • R

    320questions

    R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

  • Mecab

    178questions

    Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。