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

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

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

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

Q&A

解決済

2回答

6638閲覧

R ある行ごとに和を算出したい

退会済みユーザー

退会済みユーザー

総合スコア0

R

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

0グッド

1クリップ

投稿2017/07/24 06:09

統計とRを独学している初心者です。
表題の件について方法を知りたいです。

以下のような10分毎の1年分のファイルxがあります。
1 2017/1/1 0:00 0
2 2017/1/1 0:10 0
3 2017/1/1 0:20 0
4 2017/1/1 0:30 0
5 2017/1/1 0:40 0
6 2017/1/1 0:50 10
7 2017/1/1 1:00 25
8 2017/1/1 1:10 0

144 2017/1/1 23:50 0
145 2017/1/2 0:00 0
146 2017/1/2 0:10 0

52560 2017/12/31 23:50 0

そこで、3列目(V3)の値の、0:00~23:50の和を、
4列目(V4)に入れていきたいのです。

とりあえず、全行について、144行分(=1日)を算出し、
あとで、0:00の行だけ抽出するという方法でやろうとおもっても、例えば、

x$4<-x[1:144,3]

とかしたとしても、次の行に移ることが出来ないので、
そこの方法がわかりません。。
applyを使えばうまくできるのでしょうか。それともプログラムを書かないとだめでしょうか。
プログラムは、まだうまくかけないので、1コマンドずつ書いて処理をしながら
勉強しているところです。

なお、0:00の行だけ抽出するには、
x_0 <-x[x$V2=="0:00",]
でうまくいくことまでは発見(汗)しています。
情けないですが、すごく時間をかけてしまいます。。

申し訳ありませんが、どなたかご教授頂けないでしょうか。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

日毎の集計がしたいのであれば、次のコードでできます。
(ここでは日付の列名をdate, 欲しいデータが入っている列名をdataとしています)

R

1library(dplyr) 2df %>% 3 group_by(date) %>% 4 summarise(sum = sum(data))

dplyr というパッケージを使っていますが、R においてはデファクトスタンダード状態です。
使い方は「dplyrを使いこなす!」を参照してください。

ちなみに、こんな感じで出力されます。

R

1date sum 2<fctr> <int> 32017/7/24 7716 42017/7/25 7882 52017/7/26 6984

もし時間の各業を残して置きたい場合は以下のコードです。

R

1library(dplyr) 2df %>% 3 group_by(date) %>% 4 mutate(sum = sum(data))

また最終的には時間帯別で分析したいとのことでしたが、時間帯についてのカテゴリデータを作って、それに対して group_by するのが良いと思います。
(0:004:00なら1、4:009:00なら2 みたいな列を作ってそれに対してgroup_byする感じです)

投稿2017/07/24 07:43

ray.prorsum

総合スコア73

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

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

退会済みユーザー

退会済みユーザー

2017/07/24 07:57

dplyrについて、インストールすら未だだったので、やってみました。 色々な方法があるモノですね…filterとか、すごく使いやすそうに感じます。 24時間の1日分ではなく、時間帯を区切った分析の所でこれからちょっとやってみます!!
ray.prorsum

2017/07/24 08:03

お役に立てたようで、何よりです!
guest

0

ベストアンサー

  1. 日付ごとにデータフレームを分割
  2. 分割したデータフレーム毎に V3 の和を V4 に追加
  3. 分割したデータフレームをマージ

ではダメですか?

投稿2017/07/24 06:17

tamy

総合スコア442

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

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

退会済みユーザー

退会済みユーザー

2017/07/24 06:39

すみません!!!! 実は、最終的には16:00~15:50の1日とか、 16:00~翌朝9:00とか、そういう風に時間の区切り方を変えて分析したいと思っているので、 そこに発展させるためには、日付毎に分割する方法では後々応用出来ないと考えてます。 発展後のことを元々の質問に記載しておりませんでした。 せっかくコメント頂いたのに、本当に申し訳ありません。
tamy

2017/07/24 06:43

ともあれ,時刻は10分刻み=1日は144行なので,開始時刻から144行分のデータでデータフレームを分割したらいい話ですよね?
tamy

2017/07/24 06:47

より一般的な方法論で言えば,全部いっぺんに処理する方法を考えるより,注目したいデータだけを引っ張って(データ分割して),処理して,欲しいデータ形式にまとめるって方が考えやすいし,動作チェックや処理の部分的変更も楽だと思います.
退会済みユーザー

退会済みユーザー

2017/07/24 07:06

なるほどですね。エクセルばかりに慣れてしまったがために、処理の考え方が違うんだということに いつもいつも気づかされます…で、 k=-144 splitData<-split(x,1:k) とやってみたところ、 X1.V1 2015/1/1 0:00 0 2015/1/2 0:00 0 2015/1/3 0:00 0 2015/1/4 0:00 2 2015/1/5 0:00 1.5 2015/1/6 0:00 1 ¦ 2015/12/31 0:00 0 X2.V1 2015/1/1 0:10 0 2015/1/2 0:10 0 2015/1/3 0:10 5 2015/1/4 0:10 3 2015/1/5 0:10 5 2015/1/6 0:10 1 ¦ 2015/12/31 0:10 2 のように、時間毎にデータフレームが分かれてしまいました。 そうではなくて、0:00~23:50の1日単位で分割するためには、 この記述では何が足りないのかがわかりません・・・(涙)
tamy

2017/07/24 07:14

この場合,split は適切ではなくて,あるデータフレームを指定した行数毎に分割する slice とかそんな感じの関数を自作しなくてはいけません. 例) slice <- function(df, n) { len <- nrow(df); lapply(seq(1, len, n), function(i){ x[i:min(i+n-1, len),]}) }
退会済みユーザー

退会済みユーザー

2017/07/24 07:46

感動です!!うまくいきました!!!!!!! でも、 lapply(seq(1, len, n), function(i){ x[i:min(i+n-1, len),]}) の所の意味がわからないので、勉強して、応用できるようにします!! 貴重なお時間を頂き、すみませんでした。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問