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

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

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

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

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

1回答

779閲覧

tuiR パネルデータの整理にあたり、観測期間(年次データ)のすべてが揃った個体のみを、新しいデータフレームに保存したいです。

Mayu___

総合スコア4

R

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

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2021/10/06 00:35

編集2022/01/12 10:55

前提・実現したいこと

使用ソフト:R
いくつかのcsvファイルのデータを結合、ソートし、データフレーム(sorted_data)を作成しました。
sorted_dataは多少簡略化していますが、以下のようなものになります。

name year ...
A社 1999 ...
A社 2000 ...
A社 2001 ...
A社 2002 ...
B社 1999 ...
B社 2000 ...
C社 2001 ...
C社 2002 ...
D社 1999 ...
D社 2000 ...
D社 2001 ...
E社 2002 ...

この中から1999年∼2001年のデータが'全て'揃っている企業のみを新しいデータフレームに保存したいです。目標は以下の形になります。
name year ...
A社 1999 ...
A社 2000 ...
A社 2001 ...
D社 1999 ...
D社 2000 ...
D社 2001 ...

そこで、以下のソースコードを試しました。(一行目のコードで結合されたデータをソートし、"sorted_data"というデータフレームを作成しております)

該当のソースコード

sorted_data<-arrange(merge_ALLdata,name,year) y <- c(1999:2001) hit <- c() for(coname in unique(sorted_data$"name")){ if(all(y %in% sorted_data[sorted_data$"name"==coname,"year"])){ print(paste("yes", coname)) hit <- c(hit, coname) }else{ print(paste("no", coname)) } } newdf <- sorted_data[sorted_data[,1]%in%hit,]

発生している問題・エラーメッセージ

実行した結果、コンソール画面には"no"の会社のみがプリントされ、"yes"の企業が現れない状況です。 またhitのvaluesをみると、"NULL(empty)"と表示されています。 newdfの内容を確認すると、観測数(obs.)が0となっております。 おそらく最初の条件式の書き方に何か誤りがあるのではないかと思います。 上でお示ししたコードにこだわっているわけではないので、他によいやり方があれば教えていただけると嬉しいです。 言葉足らずな部分もあるかと思いますが、ご教示お願い致します。

追記

実行環境は以下の通りになります。(sessionInfo()結果) R version 4.0.0 (2020-04-24) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 19043) Matrix products: default locale: [1] LC_COLLATE=Japanese_Japan.932 LC_CTYPE=Japanese_Japan.932 LC_MONETARY=Japanese_Japan.932 [4] LC_NUMERIC=C LC_TIME=Japanese_Japan.932 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] forcats_0.5.0 stringr_1.4.0 dplyr_1.0.0 purrr_0.3.4 readr_1.3.1 tidyr_1.1.0 tibble_3.0.1 [8] ggplot2_3.3.0 tidyverse_1.3.0 loaded via a namespace (and not attached): [1] Rcpp_1.0.4.6 cellranger_1.1.0 pillar_1.4.4 compiler_4.0.0 dbplyr_1.4.4 tools_4.0.0 lubridate_1.7.9 [8] jsonlite_1.6.1 lifecycle_0.2.0 nlme_3.1-147 gtable_0.3.0 lattice_0.20-41 pkgconfig_2.0.3 rlang_0.4.6 [15] reprex_0.3.0 cli_2.0.2 DBI_1.1.0 rstudioapi_0.11 haven_2.3.1 withr_2.2.0 xml2_1.3.2 [22] httr_1.4.1 fs_1.4.1 generics_0.0.2 vctrs_0.3.0 hms_0.5.3 grid_4.0.0 tidyselect_1.1.0 [29] glue_1.4.1 R6_2.4.1 fansi_0.4.1 readxl_1.3.1 modelr_0.1.8 blob_1.2.1 magrittr_1.5 [36] backports_1.1.6 scales_1.1.1 ellipsis_0.3.1 rvest_0.3.5 assertthat_0.2.1 colorspace_1.4-1 stringi_1.4.6 [43] munsell_0.5.0 broom_0.5.6 crayon_1.3.4

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

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

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

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

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

KojiDoi

2021/10/06 05:38

文字コードの問題のような気がしますが、とりあえず、sessionInfo()した結果を質問に追記してください。
Mayu___

2021/10/06 07:03

ご返信ありがとうございます。 結果を追記致しました。 引き続きアドバイスをいただけるとありがたいです。
guest

回答1

0

試した限り、示されている方法で一応結果が得られはするようですよ。

イメージ説明

うまくいかない直接的な理由として思いつくのは、質問者さんのR環境がshift_JISをデフォルトに設定しているのに対して、入力ファイルの文字コードがUTF-8になっていたりすることです。このばあい、read.table()fileEncodingオプションを設定すれば解決するでしょう。

ただ、tapplyを使うほうがスッキリすると思います。

conames <- tapply(df1$year, df1$name, function(x){ return(all(1999:2001 %in% x)) }) df2 <- subset(df1, conames[name]) print(df2)

投稿2021/10/06 11:49

KojiDoi

総合スコア13669

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

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

Mayu___

2021/10/06 21:45

ご返信ありがとうございます!実際に実験までしていただき、感謝しております。 残念ながら、アドバイスいただいた方法をすべて試してみても同じ結果になってしまいました。 自分のRでも、上で例として挙げたdf1を使って(書きそびれてしまいましたが、実際に使っているデータはdf1と異なるものになります)コードを実行してみたのですが、うまくいきました。 是非KojiDoi様に伺いたいのですが、自分で1つ心あたりがあるとすれば、欠損値を含むテーブルを使用していることだと思います。read.csv()で元データ(欠損値あり)を読み込む際は特にエラーが出なかったため気に留めていなかったのですが、これは原因としてあり得るでしょうか? (初心者故欠損値の処理に非常に手間取りそうなため、先に質問させていただきました。無礼をお許しください) 何度も申し訳ありませんが、またご返信いただければ幸いです
KojiDoi

2021/10/06 22:26

あのですね、自分でやってもうまくいっているデータを質問に示してどうするのですか? うまくいってない方のデータがどういうものか示してくれないと真相何なのか判断のしようがないでしょ。初心者でもそれぐらいは想像できませんか? 回答者に無駄な時間を使わせないでください。 >これは原因としてあり得るでしょうか? 関係ないと思います。もちろん欠損値が入っているデータについては結果に出てきませんが、それによって他のデータまでが全部空になることは考えられません。
Mayu___

2021/10/07 05:59

ご迷惑おかけし申し訳ございませんでした。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問