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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

R

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

3回答

632閲覧

複数のデータフレームから①指定した文字列が部分一致する要素を検索し(同列内)、②一致する要素が入った行の総数を取得したいです。

apple_marcie

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

R

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/12/18 06:48

編集2021/12/18 07:03

前提・実現したいこと

少し複雑ですので、箇条書きで失礼します。
わかりにくいところがありましたら何なりとご指摘ください。
すぐに修正致します。

①持っているデータ
30日分のTwitterの投稿データ(投稿時間、テキストなど)
(データ構造)
投稿日時      | テキスト |・・・

2021/12/01 12:00      |◯◯◯◯◯◯◯◯◯◯|・・・



2021/12/17 19:00      |◯◯◯◯◯◯◯◯◯◯|・・・



2021/12/30 23:00      |◯◯◯◯◯◯◯◯◯◯|・・・


本来は30日分が一緒になっているが、処理の軽量化のため
df_1201, df_1202といったように1日ごとに分けている。

②実現したいこと
これらから各時間ごとの総数を取得したい。
例えば、1201_dfに対し処理を行うことで
1201_00_amountというオブジェクトに0時の投稿の行数を格納したい。
同様に、1時から23時までのそれぞれの行数を取得したい。
また、データフレームは先述の通り12/01~12/30までの30日分あるため、
それぞれamount_1201_00からamount_1230_23まで作成したい。

以上、実現したいことになります。

試したこと

自分で試したことは、
まず①stringrパッケージを使用して時間の部分を時間のみに置き換え、"時"のみを残して検索対象としたこと、

R

1df$Tweet.Date %<>% str_replace_all("-", "/") %>% 2 str_replace_all(":\d+:\d+$", "") 3>もともと日時表記が"2021-12-01 00:00:30"であったものを 4"2021/12/01 00"に成形した。

②"2021/12/1"を部分一致させ、投稿が2021/12/01分のdf_1201を作成、

R

1df_1201 <- df %>% filter(str_detect(Tweet.Date, "2021/12/01"))

③あとはひたすらそれぞれの時間帯ごとに行数を取得

R

1df_1201_00 <- rct_df_1201 %>% filter(Tweet.Date %in% "2021/12/01 00") 2amount_1201_00 <- df_1201_00 %>% NROW() %>% as.numeric()

といったものです。
しかし、タイプミスによって値を正しく格納できていなかったり、
どれがどの値なのか分からず後の処理に使えなかったりと問題が多発しています。
そして時間がかかり過ぎ、
行数もとんでもなく長くなるため気が遠くなりそうです…。
自力解決をと自分でも調べてみたのですが、
具体的にどのような処理が必要なのかわからず途方に暮れています。
どうかお力をお貸しいただけないでしょうか。
よろしくお願いいたします。

なお、処理の対象とするデータフレームですが
便宜上、日にちごとに分けて処理を行いましたが
分けずに処理できる様であれば分けていただかなくても構いません。

補足情報(FW/ツールのバージョンなど)

RStudio 2021.09.0+351

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

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

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

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

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

guest

回答3

0

ややこしいライブラリを使わなくても、

  • 日付データの分解
  • 当該日付時間ごとの該当レコード数をカウントしてリストに保存

で事足りるように思います。

df1 <- read.table(text=" 2021/12/01 12:00,xxx 2021/12/17 19:00,xxx 2021/12/30 23:00,xxx " , stringsAsFactors=F, header=F, sep=",") ddsum <- list() for(i in 1:nrow(df1)){ dd <- unlist(strsplit(df1[i,1], "[ :]")) # 日付ごと全部数える if(is.null(ddsum[[ dd[1] ]][["total"]])){ ddsum[[ dd[1] ]][["total"]] <- 1 }else{ ddsum[[ dd[1] ]][["total"]] <- ddsum[[ dd[1] ]][["total"]] +1 } # 日付・時間ごとに数える if(is.null(ddsum[[ dd[1] ]][[ dd[2] ]])){ ddsum[[ dd[1] ]][[ dd[2] ]] <- 1 }else{ ddsum[[ dd[1] ]][[ dd[2] ]] <- ddsum[[ dd[1] ]][[ dd[2] ]] +1 } } print(str(ddsum))

投稿2021/12/18 08:52

編集2021/12/18 08:54
KojiDoi

総合スコア13671

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

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

apple_marcie

2021/12/19 00:57 編集

回答ありがとうございます! 自分はパッケージに頼りきりだったのですが、こんな方法もあったのですね。 とても参考になりました!
guest

0

ベストアンサー

以下の様な内容の CSV ファイルを入力データとして使います。

tweet_data.csv

csv

1投稿日時,テキスト 22021/12/01 00:30,テキスト 32021/12/01 01:42,テキスト 42021/12/01 02:10,テキスト 52021/12/01 03:55,テキスト 62021/12/01 04:00,テキスト 72021/12/01 04:30,テキスト 82021/12/01 05:22,テキスト 92021/12/01 06:05,テキスト 102021/12/01 06:24,テキスト 112021/12/01 06:49,テキスト 122021/12/01 07:17,テキスト 132021/12/01 07:29,テキスト

以下では tidyverselubridate パッケージを使用しています。
処理内容は、日時でグループ化(group_by)して tally で集計しています。

r

1library(tidyverse) 2library(lubridate) 3 4tweets <- read.csv('tweet_data.csv') 5 6tweets %>% 7 mutate( 8 datetime = ymd_hm(unlist(.["投稿日時"])), 9 day = floor_date(datetime, 'day'), 10 hour = hour(datetime) 11 ) %>% 12 group_by(day, hour) %>% 13 tally %>% 14 complete(day, hour = 0:23, fill = list('n' = 0)) %>% 15 ungroup() %>% 16 mutate( 17 "日時" = ymd_h(paste(day, hour)), 18 "カウント" = n 19 ) %>% 20 select("日時", "カウント") %>% 21 print(n = 24) 22 23# 出力結果 24# A tibble: 24 x 2 25 日時 カウント 26 <dttm> <dbl> 27 1 2021-12-01 00:00:00 1 28 2 2021-12-01 01:00:00 1 29 3 2021-12-01 02:00:00 1 30 4 2021-12-01 03:00:00 1 31 5 2021-12-01 04:00:00 2 32 6 2021-12-01 05:00:00 1 33 7 2021-12-01 06:00:00 3 34 8 2021-12-01 07:00:00 2 35 9 2021-12-01 08:00:00 0 3610 2021-12-01 09:00:00 0 3711 2021-12-01 10:00:00 0 3812 2021-12-01 11:00:00 0 3913 2021-12-01 12:00:00 0 4014 2021-12-01 13:00:00 0 4115 2021-12-01 14:00:00 0 4216 2021-12-01 15:00:00 0 4317 2021-12-01 16:00:00 0 4418 2021-12-01 17:00:00 0 4519 2021-12-01 18:00:00 0 4620 2021-12-01 19:00:00 0 4721 2021-12-01 20:00:00 0 4822 2021-12-01 21:00:00 0 4923 2021-12-01 22:00:00 0 5024 2021-12-01 23:00:00 0

投稿2021/12/18 08:13

melian

総合スコア19865

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

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

apple_marcie

2021/12/19 00:57

ご丁寧な回答ありがとうございました! どなた様の回答もとても参考になりました。 ベストアンサーを決めかねておりましたが、 特に実装しやすかったこちらの回答をベストアンサーとさせていただきました。 ありがとうございました!
guest

0

Rは日時を扱うことが面倒なのでしょうか。

次の質問・回答ではstrptimeを使用することで日時を文字列ではなく、日時として扱い、条件を指定してデータを抽出しているようです。

r

1f <- "%Y/%m/%d %H:%M:%S" 2log.ac$date <- strptime(log.ac$date, format=f) 3before <- strftime("2017/09/05 09:38:00", format=f) 4after <- strftime("2017/09/05 10:00:00", format=f) 5print(subset(log.ac, before<date & date<after))

https://teratail.com/questions/374429

該当するデータを抽出して、抽出したデータの件数をカウントできそうに思いましたが、いかがでしょうか。

https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/subset
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/strptime
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/nrow

投稿2021/12/18 08:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

apple_marcie

2021/12/19 00:59

URLまで貼っていただきありがとうございます! 確かにこちらでもスマートに実装できそうです!ありがとうございます、参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問