パネルデータの同一IDの標本の絞り込み

投稿者: Anonymous パネルデータにおけるIDごとの抽出 の続きです。 同じIDの最新データのみを抽出したいです。 具体的には ID,PANEL,Q1,Q3,Q6,Q8,Q11,Q13,Q16,Q18,Q33,Q34,Q128,Q137,Q299 50,9,1,39,NA,13,NA,NA,NA,NA,5,0,90,90,0 50,10,1,40,2,14,3,13,8,69,7,0,84,84,0 50,11,1,16,2,15,3,12,8,68,9,0,100,100,0 51,7,1,38,2,13,3,12,NA,NA,4,3,0,0,0 51,8,1,39,2,14,3,13,NA,NA,7,0,36,36,0 51,9,1,40,2,15,NA,NA,NA,NA,6,0,59,59,0 51,10,1,41,2,16,3,15,NA,NA,7,0,86,86,0 51,11,1,42,2,17,3,16,NA,NA,6,0,80,80,0 52,7,1,40,2,13,3,7,NA,NA,0,0,0,0,0 52,8,1,41,2,14,3,8,NA,NA,0,0,0,0,0 53,7,1,34,2,5,3,5,8,59,0,0,0,0,0 53,8,1,35,2,6,3,6,8,60,4,0,0,0,0 を ID,PANEL,Q1,Q3,Q6,Q8,Q11,Q13,Q16,Q18,Q33,Q34,Q128,Q137,Q299 50,11,1,16,2,15,3,12,8,68,9,0,100,100,0 51,11,1,42,2,17,3,16,NA,NA,6,0,80,80,0 52,8,1,41,2,14,3,8,NA,NA,0,0,0,0,0 53,8,1,35,2,6,3,6,8,60,4,0,0,0,0 としたいと考えています。(最新のデータのみを抽出) PANELのところが第何回調査ということです。 行の抽出なのでdplyrのfilterを使いたいですがID内でのPANELの最大値の抽出の仕方がわからないです。 https://stackoverflow.com/questions/24237399/how-to-select-the-rows-with-maximum-values-in-each-group-with-dplyr を参考に data %>% group_by(ID) %>% filter(PANEL=max(PANEL)) とやってもうまくいかないです。 エラーメッセージはError: filter condition does not evaluate to a logical vector. です。 よろしくお願い致します。 解決 一度、欲しい形のIDとPANELのセットだけを含むテーブルを作成し、 それに結合してはどうでしょうか? master <- data %>%…(Continue Reading)

tidyrで連番データにデータクリーニング

投稿者: Anonymous Rのtidyrでデータクリーニングをしたいと考えています。 データはラベルが付いていないものを読み込んだのでV1~V1998となっており、型はデータフレームで名前はdfです。 v1,v2,v3,…,v1998 1,13,23,…,32 2,14,26,…,32 4,14,27,…,38 5,… … 354,243,543,…,657 のようにv1に時間がはいり、V2~はそれぞれの人のデータとなっております。 これを time,data 1,13 2,14 4,14 …. 354,243 1,23 2,26 …. のように縦に並べたいと考えています。timeにV1の値が入り、dataにV2~の値が入る形です。 df %>% tidyr::gather(key =time,value = data,df[,2:1998]) などとやってもエラーが出てしまいます。 どう対処すればよいでしょうか? よろしくお願いします。 追記 tidyrでないパッケージ利用でも構いません。(スピードが実用に耐えられればですが…) 解決 以下を試してみてください: library(dplyr) library(tidyr) df <- data.frame( v1 = 1:5, v2 = sample(11:20, 5), v3 = sample(21:30, 5), v4 = sample(31:40,…(Continue Reading)

dplyrのinner_joinで2つの条件で結合する際のエラー

投稿者: Anonymous Rを用いてdplyrでパネルデータの1回ラグをとったデータを作りたいと考えています。 plmなどのパッケージの利用も考えましたが、普通の回帰だけでなくより高度な分析も考えているのでデータフレーム自体をいじりたいと考えています。 データid <- id.csvは以下のような感じです。 ID time y x1 x2 1 1 5 7 8 1 2 2 6 10 1 3 9 9 6 2 1 6 2 3 3 7 1 6 3 これをdplyrで id1 <- id %>% mutate(time1=time-1) id2 <- id %>% select(ID,time,y) id3 <- id2 %>% inner_join(id1,by=c(“time”=”time1″,”ID”=”ID”)) と操作すると最後のinner_joinのところで Error:…(Continue Reading)

SASでのkeepはRやPythonではどのように書くのか

投稿者: Anonymous SASの場合 keep q1 q22_01-q22_15 q25 q28 q33_3-q33_21; のように落とさず持ってくる変数を連続で指定できますが、RやPythonではどのように書くのでしょうか。 SASのように一文で書きたいです。複数のデータフレームに指定してマージ、というのは避けたいです。 Rだとdplyrを用いて select(df, q1, num_range(prefix = “q22_”, range = 1:3, width = 2),q25,q28, num_range(prefix = “q33_”,width=1)) でしょうか。 Pythonだと df[‘q22_01′:’q22_15’]やdf[[‘q25’, ‘q28’]] のような書き方があるようですが混在させられず困っています。 なにか良い方法等あるでしょうか。 (そもそも前者は連番を処理してはおらず隣り合ったカラム同士を処理しているだけですが…) どうぞよろしくお願いいたします。 解決 Pythonの場合は、次のように書けます。 df[[‘q1’] + [‘q22_’ + format(i, ’02d’) for i in range(1,16)] + [‘q25’, ‘q28’] + [‘q33_’ + str(i) for i…(Continue Reading)

時系列データでラグを取った場合のNAへの対処

投稿者: Anonymous http://notchained.hatenablog.com/entry/2015/04/24/223027 を参考にラグをとりたいのですが、解説にもあるようにやはり先頭行がNAになってしまいます。 データフレームの2列目から20000列目までをラグをとりたいですが、2つほど気になる点があります。 新しい列を作りたくないのですが、その場合、library(tidyverse)のもとで mutate(a = a – lag(a)) でよろしいでしょうか。 先頭行のNAをその次の行の値で埋めたいのですが 列名が非常に複雑で、番地を指定してループを回す方法で行きたいのですがうまくいきません。 下のコードではエラーでした。 for(i in 2:20000){ df <- df %>% mutate(df[,i] = df[,i] -lag(df[,i])) } for (i in 2:20000){df[1,i] <- df[2,i]} 追記 先頭行のNAをその次の行の値で埋めるとはこういう感じです。 投稿を利用させていただきました。 df_lag #> col1 col2 col3 col4 col5 #> 1 NA NA NA NA NA #> 2 6 5 4…(Continue Reading)

dplyr & ggplot2: リストに入った回帰分析の結果をまとめて図にする

投稿者: Anonymous データ1~3に対して複数の回帰分析を行い、その結果をこのサイトにあるような図にまとめたいと考えています。 回帰分析の結果は以下のようにまとまっています。 > lmRes_set Source: local data frame [5 x 3] Groups: <by row> # A tibble: 5 × 3 iter lmResRand lmResBias * <dbl> <list> <list> 1 1 <data.frame [7 × 5]> <data.frame [7 × 5]> 2 2 <data.frame [6 × 5]> <data.frame [6 × 5]> 3 3 <data.frame [6 × 5]>…(Continue Reading)

Rで連番のデータフレームを加工して連番で出力する

投稿者: Anonymous Rでデータ前処理中ですが2つほど質問があるので書かせていただきます。 1 data1~data3というデータフレームを読み込み済みで, sum1.csv~sum3.csvというファイルを生成したいと考えています。(実際はもっとパターンが多いため単純に全パターン書くというのは厳しいです。)assignやcsvdataのあたりで読み込みが上手く行かずエラーが出てしまうのでアドバイスをお願い致します。アルゴリズムとしましてはdataにdata1を代入、それを加工しつつcsvdataに加工し出力、dataにdata2を上書きして同じことを繰り返す…という感じです。 library(tidyverse) main <- for(p in 1:3){ assign(data,paste(“data”, p, sep = “”)) csvdata <- data %>% mutate(hogehoge…) write_csv(csvdata,paste0(“sum”,p,”.csv”)) } 2 bind_rows(as.data.frame(a1),as.data.frame(a2),as.data.frame(a3)) とデータフレームを縦にくっつけたいのですが、3つのデータフレーム間に空白行がほしいです。 どのように対処すればよいでしょうか? 解決 こういう感じのコードではどうでしょうか: # パッケージ読み込み library(tidyverse) # テスト用にdata.frame作成 # 以下のコードでdata1-data3というdata.frameができます data_list <- paste(“data”, 1:3, sep = “”) for(i in 1:length(data_list)) { assign( data_list[i], data.frame( x1 = rnorm(10), x2…(Continue Reading)

dplyrでmatrixをmutateしたい

投稿者: Anonymous Rで生成したデータの前処理 で以前質問したのですが、dplyrを用いた場合の最後のmutateのところがうまく行きません。 params <- expand.grid(p = 1:2, q = 1:1, r = 1:2, s = 1:1) ans <- params %>% rowwise() %>% mutate(aic = f(p, q, r, s)) 関数fの部分は単独で変数を指定(コンソールにf(1,1,1,1)などと打ち込む)するとしっかり 返ってきて問題はないようですが、返り値がmatrixになっているためas.data.frameで直すと変なくっつき方をしました(具体的にうまく説明できない)。 そのため、しっかり横につなげようとmatrixを転地したあとくっつけようとすると Error: incompatible size (4), expecting 1 (the group size) or 1 のエラーが出ました。そのため、matrixの中身だけ取り出そうと ans <- params %>% rowwise() %>% mutate(aic = f(p, q,…(Continue Reading)

Rによる存在しない項目も含めたcsvファイルの結合

投稿者: Anonymous Rを使用しcsvファイルの編集をしています。 library(dplyr) library(data.table) lf <- list.files(full.names = F, pattern=”csv”, recursive = FALSE) data <- data.frame() for(i in 1:len(lf)){ add <- fread(lf[i]) %>% select(ID,hogehoge) data <- rbind(data,add) } という感じでアンケートデータの結合を行っているのですが、hogehogeのなかの質問項目が途中まではなかったのに何回目からの調査からか質問が導入されたものがありエラーで困っています。 できれば質問されていない回の解答をNAとして統合したいのですがどのようにすればよいのでしょうか。 すべての項目を結合(その回に存在しない項目はNA扱い)してからselectでもかまわないです。 よろしくお願い致します。 追記 Error in select(., hogehoge) : unused argument (hogehoge) のエラーが途中で出ましたが、dplyrとdata.tableのselectが競合しているためのエラーのようです。 dplyr::select()とすることで解消しました。 また、上のプログラムについては http://www.housecat442.com/?p=698 を参考にさせていただきました。 解決 rbind()の代わりにdplyrパッケージのbind_rows()を用いることで解決できると思います 例 df1 <- data.frame(a = 1:2,…(Continue Reading)

dplyrを用いてデータフレーム内の型を統一したい

投稿者: Anonymous データクレンジングの途中で Error: Can not automatically convert from character to integer in column “hoge”. というエラーが出るので、dplyrを用いてデータフレーム内の型を統一(=全てのカラムをcharacterではなくnumericに変換)したいのですが、 https://stackoverflow.com/questions/34123199/using-mutate-each-from-dplyr-to-convert-all-numeric-varaibles-to-factor を参考に iris %>% mutate_each(funs(as.numeric),sapply(df,is.numeric)) を利用したいのですが、このコードのis.numericを否定にして(=数値でない時applyしたい)うまく動かしたいです。 わかる方よろしくお願い致します。 追記 http://qiita.com/ytakeda/items/b996d93b33803409efb3を使うこともできますが、パイプで連続処理したいです。 また、mutate_each(funs(as.numeric), which(sapply(., is.character)))で今回はエラー回避することが出来ました。 解決 mutate_ifやmuatate_at関数を利用して、対象のデータ型あるいは変数を指定できます。 例のirisデータセットの数値が あらかじめ数値型としてセットされているので、一旦文字列型に変更しています str(iris) ‘data.frame’: 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 … $ Sepal.Width…(Continue Reading)