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

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

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

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

Q&A

解決済

2回答

1164閲覧

R リストの一括編集

退会済みユーザー

退会済みユーザー

総合スコア0

R

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

0グッド

1クリップ

投稿2017/07/26 01:25

一年分、10分毎のデータを、日別にリスト化したデータx_listを以下のように作成しました。

head(x_list)

[[1]]
V1 V2 V3 V4 V5
1 2015/1/1 0:00 0 3.2
2 2015/1/1 0:10 0 3.6
3 2015/1/1 0:20 0 3.2
4 2015/1/1 0:30 0 3.3
5 2015/1/1 0:40 0 3.2
6 2015/1/1 0:50 0 3.8
7 2015/1/1 1:00 0 3.0
8 2015/1/1 1:10 0 3.4

V1.1 V2.1 V3.1 V4.1 V5.1
145 2015/1/2 0:00 0 1.1
146 2015/1/2 0:10 0 1.4
147 2015/1/2 0:20 0 1.6
148 2015/1/2 0:30 0 1.8
149 2015/1/2 0:40 0 2.0
150 2015/1/2 0:50 0 1.98
151 2015/1/2 1:00 0 2.0
152 2015/1/2 1:10 0 2.0

V1.144 V2.144 V3.144 V4.144 V5.144
52417 2015/12/31 0:00 4.1 1.0
52418 2015/12/31 0:10 4.2 1.3
52419 2015/12/31 0:20 4.4 1.1
52420 2015/12/31 0:30 4.3 1.1
52421 2015/12/31 0:40 4.5 1.3
52422 2015/12/31 0:50 4.5 1.4
52423 2015/12/31 1:00 4.1 1.5
52424 2015/12/31 1:10 4.0 1.3

で、V3列、V4列の日毎の最大値や集計値を出したいのですが、例えば
sum(x_list$V3)
sum(x_list$V3.1)
を、全てのリスト一括でできるスクリプトの書き方がわかりません。

forやwhile 例えば
x<-0
while(x<=144){
x<-x+1
}
などをうまく使う?それとも、apply関数をうまく使う??
そういった辺りは本やネットで探したのですが、それらをどう組み合わせたら
良いかがわからないので、どなたかアドバイス頂けないでしょうか。。

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

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

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

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

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

KojiDoi

2017/07/26 03:15

この質問文ではデータの構造が今ひとつよく判りません。日付ごとに別項目になっているのかとも思いましたが、それなら12月31日は144ではなく365になりそうですし。リストの構造をもう少し明快に示して下さい。
退会済みユーザー

退会済みユーザー

2017/07/26 04:10

確認頂いてありがとうございます。色々試していて、例えばとして「リスト化したデータx_list」を手修正したため、144という数字は誤っていました。御指摘の通り、リストの構造としては、10分毎の1年分のデータを、日付毎に365個にリスト化したものになります。
what_alnk

2017/07/26 13:31

`x_list[[1]]` に 2015-01-01 のデータが入っていて列名が `V1, V2, V3, V4, V5`,`x_list[[2]]` に 2015-01-02 のデータが入っていて列名が `V1.1, V2.1, V3.1, V4.1, V5.1`,... ということでしょうか.あと.出力としては何を想定していますか?list でしょうか?data.frame でしょうか?
guest

回答2

0

質問では日ごとの list になっていますが,一旦 data.frame にして dplyr パッケージで処理した方が楽だと思います.

list に入っている各 data.frame の列名はすべて同じだとして,

  1. bind_rows()で一つのdata.frame()にして
  2. group_by() で日ごとにグループ化して,
  3. summarise_atX4X5 について sum() をとる,

という流れです.

r

1library(dplyr) 2library(readr) 3 4d1 <- read_delim(" 51 2015/1/1 0:00 0 3.2\n 62 2015/1/1 0:10 0 3.6\n 73 2015/1/1 0:20 0 3.2\n 84 2015/1/1 0:30 0 3.3\n 95 2015/1/1 0:40 0 3.2\n 106 2015/1/1 0:50 0 3.8\n 117 2015/1/1 1:00 0 3.0\n 128 2015/1/1 1:10 0 3.4\n 13", 14 delim = " ", col_names = FALSE, col_types = cols(col_integer(), col_date("%Y/%m/%d"), 15 col_character(), col_double(), col_double())) 16 17d2 <- read_delim(" 18145 2015/1/2 0:00 0 1.10\n 19146 2015/1/2 0:10 0 1.40\n 20147 2015/1/2 0:20 0 1.60\n 21148 2015/1/2 0:30 0 1.80\n 22149 2015/1/2 0:40 0 2.00\n 23150 2015/1/2 0:50 0 1.98\n 24151 2015/1/2 1:00 0 2.00\n 25152 2015/1/2 1:10 0 2.00\n 26", 27 delim = " ", col_names = FALSE, col_types = cols(col_integer(), col_date("%Y/%m/%d"), 28 col_character(), col_double(), col_double())) 29 30d3 <- read_delim(" 3152417 2015/12/31 0:00 4.1 1.0\n 3252418 2015/12/31 0:10 4.2 1.3\n 3352419 2015/12/31 0:20 4.4 1.1\n 3452420 2015/12/31 0:30 4.3 1.1\n 3552421 2015/12/31 0:40 4.5 1.3\n 3652422 2015/12/31 0:50 4.5 1.4\n 3752423 2015/12/31 1:00 4.1 1.5\n 3852424 2015/12/31 1:10 4.0 1.3\n 39", 40 delim = " ", col_names = FALSE, col_types = cols(col_integer(), col_date("%Y/%m/%d"), 41 col_character(), col_double(), col_double())) 42 43x_list <- list(d1, d2, d3) 44 45x_list %>% bind_rows() %>% group_by(X2) %>% summarise_at(vars(X4, X5), funs(sum)) 46#> # A tibble: 3 × 3 47#> X2 X4 X5 48#> <date> <dbl> <dbl> 49#> 1 2015-01-01 0.0 26.70 50#> 2 2015-01-02 0.0 13.88 51#> 3 2015-12-31 34.1 10.00

投稿2017/07/26 16:34

what_alnk

総合スコア147

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

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

退会済みユーザー

退会済みユーザー

2017/07/27 00:48

元々、1年分の10分データが一覧となっていたデータで、今は0:00~23:50の一日分でまず分析をしようと思っているのですが、後々時間の区切りを変えて(9:00~16:50の日中とか、16:00~9:00の夜間とか)分析もしてみようと思っているので、なんらかまずリスト化した方がやりやすいかと思って分割していた次第です。 だけど、元々のデータフレームでも、group_byを使えば、時間区切りをいくつかに分けることで、リスト化しなくても集計が出来るということですね?。ありがとうございます、やってみます!!
what_alnk

2017/07/27 05:24

ある区間のみを対象にしたいのなら,filter というdplyr パッケージの関数で,「ある列の値に基づいて対象行を絞り込む」,という操作ができるので,それをgroup_by の前にすればできます.
退会済みユーザー

退会済みユーザー

2017/07/27 07:00 編集

やってみました!リスト化せず、元々のデータフレームに > x_2<- x %>% group_by(V1) %>% summarise_at(vars(V3),funs(sum)) と、そのままやってみたら簡単すぎて感動しました(苦笑)たすかりました! 14:24にアドバイス頂いた点も、これからトライしてみます。
guest

0

ベストアンサー

対象リストは以下のtestdataのような構造だと理解しました。間違っていたら補足してください。

> testdata [[1]] V1 V2 V3 V4 V5 1 1 2015/1/1 0:00 0 3.2 2 2 2015/1/1 0:10 0 3.6 3 3 2015/1/1 0:20 0 3.2 4 4 2015/1/1 0:30 0 3.3 5 5 2015/1/1 0:40 0 3.2 6 6 2015/1/1 0:50 0 3.8 7 7 2015/1/1 1:00 0 3.0 8 8 2015/1/1 1:10 0 3.4 [[2]] V1 V2 V3 V4 V5 9 145 2015/1/2 0:00 0 1.10 10 146 2015/1/2 0:10 0 1.40 11 147 2015/1/2 0:20 0 1.60 12 148 2015/1/2 0:30 0 1.80 13 149 2015/1/2 0:40 0 2.00 14 150 2015/1/2 0:50 0 1.98 15 151 2015/1/2 1:00 0 2.00 16 152 2015/1/2 1:10 0 2.00 [[3]] V1 V2 V3 V4 V5 17 52417 2015/12/31 0:00 4.1 1.0 18 52418 2015/12/31 0:10 4.2 1.3 19 52419 2015/12/31 0:20 4.4 1.1 20 52420 2015/12/31 0:30 4.3 1.1 21 52421 2015/12/31 0:40 4.5 1.3 22 52422 2015/12/31 0:50 4.5 1.4 23 52423 2015/12/31 1:00 4.1 1.5 24 52424 2015/12/31 1:10 4.0 1.3

リストを対象にするので、lapplyかsapplyを使う手が思い浮かびます。
sapply(リスト, リストの成分一つ一つに対して何か処理する関数)
のように使います。結果は行列として返ってきます。lapplyも使い方はほぼ同じですが、結果がリストで返ってくる点が異なります。

で、次のようにすると、日付ごとにtestdataの4列目と5列目の合計を取得することができました。

> t(sapply(testdata, function(x){return(c(x[1,2], sum(x[4]), sum(x[5])))} )) [,1] [,2] [,3] [1,] "2015/1/1" "0" "26.7" [2,] "2015/1/2" "0" "13.88" [3,] "2015/12/31" "34.1" "10" >

投稿2017/07/26 13:34

KojiDoi

総合スコア13671

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

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

退会済みユーザー

退会済みユーザー

2017/07/27 05:12

その後試行錯誤を重ねていまして、御連絡が遅くなりました。申し訳ありません。 ご教授頂いた通りやってみたところ、出来ました!!! 一応エクセルで検算もしてみましたが、一致したので大丈夫そうです。 sapplyとlapplyについて、色々読んでみたものの、いまひとつ使い分けがピンときていませんでしが、端的に表現くださり、ピンと来たような気がします!ありがとうございます。 で、やってみて、2点疑問点がありました。お手隙の際にご教授願えませんでしょうか。 1)> t(sapply( … のtってなんでしょうか。 2)教えて頂いた上記コマンドで全く同様にやってみたところ、[,]の列のみ、日付でなく、365行すべて「1」でリターンが返ってきました。元データの型の違いでしょうか??
KojiDoi

2017/07/27 05:22

> t 行と列を入れ替える関数です。入れ替えたのはまあ私の趣味なんですが、桁が365もあるデータは見にくくてしょうがないので私としては避けているわけです。 > [,]の列のみ、 すみません、ちょっと意味がわかりませんが。
退会済みユーザー

退会済みユーザー

2017/07/27 05:29

はっ、すみません。 [,1]の列のみ、日付でなく、365行すべて「1」でリターンが返ってきました。 です。   ↓ここ [,1] [,2] [,3] [1,] "2015/1/1" "0" "26.7" "2015/1/1" ではなく、"1"という値が一列続いてます。 t…なるほどですね。。これが無いと、横に表示されてしまうのですね(汗) 趣味ではないです、見易さのためには必要です!! デフォルトで綺麗に縦に合計値が並ばないんですね。。たしかに。。
KojiDoi

2017/07/27 17:58

>365行すべて「1」でリターンが返ってきました。 すみませんがこちらでは現象を再現できませんでした。たぶん私が試したリストとあなたが試したリストの間に微妙な構造の差があるのではないかと想像しますが。
退会済みユーザー

退会済みユーザー

2017/07/28 01:04

再現できるか試していただいたのですね。 こちらのリストでは、日付の列はdouble型に変換してあるのですが、、 1月1日から順になっているといいのですが、途中で順序が入れ子になっていたらちょっと確認できないですね。。 お時間を割いて頂いて申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問