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

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

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

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

Q&A

解決済

1回答

287閲覧

Rで縦持ちデータの横持ちデータへの変換

keikmyo

総合スコア10

R

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

0グッド

0クリップ

投稿2024/07/10 02:56

編集2024/07/17 07:45

イメージ説明### 実現したいこと
現在データ解析をしております。
添付のEXCELにございます左の表を右の表の様に縦持ちデータを横持データにした後に各receiptnameに該当する物ごとの色分けをしたいと考えております。イメージ説明
近い表は出来上がるのですが、目的としてる表にはならず、困っております。

発生している問題・分からないこと

具体的には、完成形で年月表記にしたいところが、年月日表記のままであり、receiptnameのところにも対象となるものが複数挿入されたりなど問題が発生しています。
また、うまく色付けをしたいのですが、上記ポイントで止まってしまい、最後まで進めておりません。

エラーメッセージ

error

1具体的には、エラーはでず出力できていますが、目的とする表にはなっておりません。

該当のソースコード

selected_data_subset1 |> add_row( actdate = seq.Date( min(selected_data_subset1$actdate), max(selected_data_subset1$actdate), by = "1 month" ) ) |> distinct(actdate, .keep_all = TRUE) |> pivot_wider( names_from = actdate, names_sort = TRUE, values_from = receiptname ) |> drop_na(patientid) |> unite("receiptname", !patientid, remove = FALSE, na.rm = TRUE)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ソースコードを自分なりに調べてみましたが、解決方法が見つからずに至っております。

補足

特になし

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

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

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

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

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

guest

回答1

0

ベストアンサー

目標としては、セルに2つ表示されるのではなく該当する月に同じ(物)プロダクトがある場合はpatientidを2行にし、一つのセルに一つのプロダクトとしたい

row_id 列(row_number())を追加してから pivot_wider() を実行します。この様にすることで、patientid + row_id(pivot_wider() におけるインデックス値)がユニークになるので期待する出力になるかと思います。

r

1suppressMessages(library(tidyverse)) 2 3A <- data.frame( 4patientid = c(1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4), 5receiptname = c('a', 'b', 'a', 'c', 'd', 'b', 'd', 'a', 'c', 'd', 'b'), 6actdate = as.Date(c('2020-01-15', '2020-01-15', '2020-02-20', '2020-03-10', '2020-03-10', '2020-04-05', '2020-05-25', '2020-05-25', 7'2020-06-17', '2020-07-19', '2020-07-19')) 8) 9 10A <- A |> 11 mutate(year_month = format(actdate, "%Y-%m")) |> 12 select(-actdate) |> 13 # add unique id 14 mutate(row_id = row_number()) |> 15 pivot_wider( 16 names_from = year_month, 17 names_sort = TRUE, 18 values_from = receiptname 19 ) |> 20 select(-row_id) |> 21 drop_na(patientid) |> 22 unite("receiptname", !patientid, remove = FALSE, na.rm = TRUE) 23 24A 25 26# # A tibble: 11 × 9 27# patientid receiptname `2020-01` `2020-02` `2020-03` `2020-04` `2020-05` `2020-06` `2020-07` 28# <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 29# 1 1 a a <NA> <NA> <NA> <NA> <NA> <NA> 30# 2 1 b b <NA> <NA> <NA> <NA> <NA> <NA> 31# 3 2 a <NA> a <NA> <NA> <NA> <NA> <NA> 32# 4 2 c <NA> <NA> c <NA> <NA> <NA> <NA> 33# 5 2 d <NA> <NA> d <NA> <NA> <NA> <NA> 34# 6 3 b <NA> <NA> <NA> b <NA> <NA> <NA> 35# 7 3 d <NA> <NA> <NA> <NA> d <NA> <NA> 36# 8 3 a <NA> <NA> <NA> <NA> a <NA> <NA> 37# 9 4 c <NA> <NA> <NA> <NA> <NA> c <NA> 38# 10 4 d <NA> <NA> <NA> <NA> <NA> <NA> d 39# 11 4 b <NA> <NA> <NA> <NA> <NA> <NA> b

追記

EXCELに出力した時にaがあるセルは黄色、bがあるセルは青色、cがあるセルは赤色、dがあるセルは紫色に…

A[row - 1, col - 1] ではなく A[row - 1, col] ではないかと思います。

r

1for (row in 2:(nrow(A) + 1)) { 2 for (col in 2:ncol(A)) { 3 cell_value <- A[row - 1, col] 4 style <- setColor(cell_value) 5 if (!is.null(style)) { 6 addStyle(wb, sheet = 1, style = style, rows = row, cols = col, gridExpand = TRUE) 7 } 8 } 9}

イメージ説明

投稿2024/07/10 07:40

編集2024/07/17 07:26
melian

総合スコア20255

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

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

keikmyo

2024/07/11 02:18

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
keikmyo

2024/07/11 02:20

ありがとうございます。 概ね、目的とする表にはなりました! 一点、receiptname列にNULL_NULL_NULL_やA_A_A_などと実際の表では記載がされております。 selected_data_subset1[selected_data_subset1 == "NULL"] <- "" こちらのコードなどで試しておりますが、何か改善点などありますでしょうか?
melian

2024/07/11 02:54

確認ですが、元々の selected_data_subset1 の receiptname列に NULL_NULL_NULL_ などの様なデータが含まれているのか、それともピボット処理の後に含まれているのでしょうか?
keikmyo

2024/07/11 08:35

コメントありがとうございます。 こちらはピポット処理の後にNULLとでてきており、元々のデータには含まれておりません。
melian

2024/07/11 17:08

了解です。それでしたら is.na() を使うとよいかと思います。 selected_data_subset1[is.na(selected_data_subset1)] <- ""
keikmyo

2024/07/12 06:44

ありがとうございます。 再度、こちらでチャレンジしてみたいと思います。
keikmyo

2024/07/17 02:04 編集

先日はありがとうございました。こちら解決済みとしておりますが、追加でご質問をよろしいでしょうか? 実際のデータでコードを走らせると同じセルにreceiptname上の該当する物が一緒に表示されてしまいます。 目標としては、セルに2つ表示されるのではなく該当する月に同じ(物)プロダクトがある場合はpatientidを2行にし、一つのセルに一つのプロダクトとしたいのですが、こちらが色々試しておりますが、うまく表示させることができません。上記コードの何れの箇所を変更すればよいのでしょうか? よろしくお願いいたします。
melian

2024/07/17 02:32

distinct(each_month, .keep_all = TRUE) |> をコメントアウトして結果を確認してみてください。
keikmyo

2024/07/17 03:39 編集

ありがとうございます。少しコードを修正しました。 再度コードを記載してみましたが、うまく表示がされません。やはり同じセルにプロダクトが2個入ってしまいます。 A <- data.frame( patientid = c(1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4), receiptname = c('a', 'b', 'a', 'c', 'd', 'b', 'd', 'a', 'c', 'd', 'b'), actdate = as.Date(c('2020-01-15', '2020-01-15', '2020-02-20', '2020-03-10', '2020-03-10', '2020-04-05', '2020-05-25', '2020-05-25', '2020-06-17', '2020-07-19', '2020-07-19')) ) A <- A %>% mutate(year_month = format(actdate, "%Y-%m")) %>% select(-actdate) %>% pivot_wider( names_from = year_month, names_sort = TRUE, values_from = receiptname ) |> drop_na(patientid) |> unite("receiptname", !patientid, remove = FALSE, na.rm = TRUE)
melian

2024/07/17 05:40 編集

なるほど、patientidが重複しているのですね。回答を編集しましたので確認してください。
keikmyo

2024/07/17 05:53

ありがとうございます。うまく解決いたしました。追加の質問となって恐縮ですが、EXCELに出力した時にaがあるセルは黄色、bがあるセルは青色、cがあるセルは赤色、dがあるセルは紫色に変更しようと試みておりますが、こちらも下記コードを記載しておりますが、文字が入っていないところも色がついてしまっております。 下記コードの間違いがうまくエラーとして出ないため困っております。 library(openxlsx) wb <- createWorkbook() addWorksheet(wb, "Sheet1") writeData(wb, sheet = 1, A) setColor <- function(cell_value) { if (grepl("a", cell_value, ignore.case = TRUE)) { return(createStyle(fgFill = "#FFFF00")) } else if (grepl("b", cell_value, ignore.case = TRUE)) { return(createStyle(fgFill = "#0000FF")) } else if (grepl("c", cell_value, ignore.case = TRUE)) { return(createStyle(fgFill = "#FF0000")) } else if (grepl("d", cell_value, ignore.case = TRUE)) { return(createStyle(fgFill = "#800080")) } else { return(NULL) } } for (row in 2:(nrow(A) + 1)) { for (col in 2:ncol(A)) { cell_value <- A[row - 1, col - 1] style <- setColor(cell_value) if (!is.null(style)) { addStyle(wb, sheet = 1, style = style, rows = row, cols = col, gridExpand = TRUE) } } }
melian

2024/07/17 07:26 編集

追記しました。
keikmyo

2024/07/17 07:47 編集

ありがとうございます。該当のソースコードにて実行しましたが、やはりセルの色がずれてしまっております。。。上部にアウトプットファイルも追加させていただきました
melian

2024/07/17 07:54

当初、 cell_value <- A[row - 1, col - 1] となっているコードを実行してみたところ、質問に追加された画像の様になっていました。これを、 cell_value <- A[row - 1, col] に変更すると、回答に追加した画像の様になります。
keikmyo

2024/07/17 08:16

回答ありがとうございます。 少しコードを修正したところ、うまくセルの色付けができました!いろいろとありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問