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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

1205閲覧

[ruby]2次元ハッシュ配列のキーごとの値を配列として取得する

cupnew1988

総合スコア20

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2022/04/28 06:39

ハッシュの配列でキー単位で値を配列として取得する方法はありますか。

<元データ> tbl = [ { "date" => "2022/04/01 12:00:00", "X1" => "101", "X2" => "202", "X3" => "313" }, { "date" => "2022/04/01 12:02:00", "X1" => "102", "X2" => "204", "X3" => "314" }, { "date" => "2022/04/01 12:04:00", "X1" => "103", "X2" => "205", "X3" => "315" }, { "date" => "2022/04/01 12:06:00", "X1" => "104", "X2" => "207", "X3" => "316" }, { "date" => "2022/04/01 12:08:00", "X1" => "105", "X2" => "209", "X3" => "317" }, ] <取得したいデータ> X1 = ["101", "102", "103", "104", "105"] X2 = ["202", "204", "205", "207", "209"]

初歩的な質問かもしれませんが、、
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

r.rb

ruby

1tbl = [ 2 { "date" => "2022/04/01 12:00:00", "X1" => "101", "X2" => "202", "X3" => "313" }, 3 { "date" => "2022/04/01 12:02:00", "X1" => "102", "X2" => "204", "X3" => "314" }, 4 { "date" => "2022/04/01 12:04:00", "X1" => "103", "X2" => "205", "X3" => "315" }, 5 { "date" => "2022/04/01 12:06:00", "X1" => "104", "X2" => "207", "X3" => "316" }, 6 { "date" => "2022/04/01 12:08:00", "X1" => "105", "X2" => "209", "X3" => "317" }, 7 { "date" => "2022/04/01 12:23:00", "X9" => "105" }, 8] 9 10values = {}.merge(*tbl) { |k, v1, v2| v1.instance_of?(Array) ? v1 + [v2] : [v1, v2] } 11p values

実行例
イメージ説明

投稿2022/04/29 12:11

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cupnew1988

2022/05/06 00:35

回答ありがとうございます。 rubyでこのような表記ができるのですね。 他の方の回答と合わせて参考にさせてもらいます。
guest

0

ベストアンサー

解決済みになってるのでなんですが、、、

keys = tbl.first.keys values = keys.map{|key| [key,tbl.map{|hash| hash[key]}]}.to_h

投稿2022/04/28 13:39

winterboum

総合スコア23329

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cupnew1988

2022/05/06 00:29

シンプルなコードですね。 mapを使えるのかな、とは思っていたので、自分にとっては簡素で使い回しできそうな良い参考例になります。 このコードをベストアンサーにさせてもらいます。 ありがとうございました。
guest

0

<入力> tbl = [ { "date" => "2022/04/01 12:00:00", "X1" => "101", "X2" => "202", "X3" => "313" }, { "date" => "2022/04/01 12:02:00", "X1" => "102", "X2" => "204", "X3" => "314" }, { "date" => "2022/04/01 12:04:00", "X1" => "103", "X2" => "205", "X3" => "315" }, { "date" => "2022/04/01 12:06:00", "X1" => "104", "X2" => "207", "X3" => "316" }, { "date" => "2022/04/01 12:08:00", "X1" => "105", "X2" => "209", "X3" => "317" }, ] vals = {} tbl.each_with_index do |row, i| keys = row.keys keys.each do |key| if i == 0 vals[key] = [row[key]] else vals[key].push(row[key]) end end end vals.each do |val| p val end <結果> ["date", ["2022/04/01 12:00:00", "2022/04/01 12:02:00", "2022/04/01 12:04:00", "2022/04/01 12:06:00", "2022/04/01 12:08:00"]] ["X1", ["101", "102", "103", "104", "105"]] ["X2", ["202", "204", "205", "207", "209"]] ["X3", ["313", "314", "315", "316", "317"]]

投稿2022/04/28 08:04

編集2022/04/28 11:53
cupnew1988

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

tbl.each do |row| keys = row.keys values = row.values p keys p values end

こんな感じでkeyとvalueで分けれます

投稿2022/04/28 06:55

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cupnew1988

2022/04/28 07:34

rowで分類できるのですね! ついでで申し訳ありませんが、 vals = [] tbl.each do |row| vals.push( row.values ) end とすると、値だけを抜き出して出力されますが、 [["2022/04/01 12:00:00", "101", "202", "313"], ["2022/04/01 12:02:00", "102", "204", "314"], ["2022/04/01 12:04:00", "103", "205", "315"], ["2022/04/01 12:06:00", "104", "207", "316"], ["2022/04/01 12:08:00", "105", "209", "317"]] 以下のように特定列のみ抜き取る方法はありますか。 X1 = ["101", "102", "103", "104", "105"] お手数をおかけします。。
cupnew1988

2022/04/28 07:51

以下で対応できました。 p vals.transpose[1] お手数をおかけしました!!
退会済みユーザー

退会済みユーザー

2022/04/28 08:08

rowで分類しているというよりかは、 tblが配列なため、eachでループを回し取り出しているhashそれぞれをrowとして扱っているだけです。 hashの数と各keyの数が同じであること前提の処理になりますが、 tbl = [ { "date" => "2022/04/01 12:00:00", "X1" => "101", "X2" => "202", "X3" => "313" }, { "date" => "2022/04/01 12:02:00", "X1" => "102", "X2" => "204", "X3" => "314" }, { "date" => "2022/04/01 12:04:00", "X1" => "103", "X2" => "205", "X3" => "315" }, { "date" => "2022/04/01 12:06:00", "X1" => "104", "X2" => "207", "X3" => "316" }, { "date" => "2022/04/01 12:08:00", "X1" => "105", "X2" => "209", "X3" => "317" }, ] vals = {} tbl.each_with_index do |row, i| keys = row.keys keys.each do |key| if i == 0 vals[key] = [row[key]] else vals[key].push(row[key]) end end end p vals こんな感じでどうでしょうか?
cupnew1988

2022/04/28 11:57

期待した通りの変換ができました。 ruby経験が浅いので、助かります。。 配列数だけループ処理するのは避けたかったので。。。
winterboum

2022/04/28 13:35

vals = {} を vals = Hash.new{|h,k| h[k] = [] } とすると if で分けずに vals[key].push(row[key]) ですみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問