1

別のデータ フレームの一致数を含むデータ フレームに列を追加したいのですが、これはかなり簡単に思えますが、うまく動作しないようです。例:

smaller_df$CountOfMatches <- nrow(subset(larger_df, Date == smaller_df$Date))

これは私にエラーを与えます:

In `==.default`(Date, smaller_df$Date) :
  longer object length is not a multiple of shorter object length

データ フレームの長さが異なることはわかっていますが、マージを求めているわけではありません。large_df 内の一致数をカウントします。

私は R に非常に慣れていないので、ここで見逃している基本的で非常に些細なことがあるはずです。

前もって感謝します

4

3 に答える 3

4

サマリーテーブルを作成し、それを元の(小さい)データとマージするのが最も簡単です。再現可能な例を用意することをお勧めします。したがって、ここにいくつかの再現可能なデータがあります:

smaller_df <- data.frame(Date=seq(as.Date("2000-01-01"), 
                                  as.Date("2000-01-10"), by="1 day"))
set.seed(5)
larger_df <- data.frame(Date=sample(seq(as.Date("2000-01-01"), 
                                        as.Date("2000-01-20"), by="1 day"),
                                    80, replace=TRUE))

の日付のテーブル(カウント)を作成しますlarger_df

tbl <- table(larger_df$Date)

これをマージに適したdata.frameに変換します

counts <- data.frame(Date=as.Date(names(tbl)), CountOfMatches=as.vector(tbl))

そして、日付にマージします。日付がに表示されていないがに表示されている場合は、larger_dfではsmaller_dfなくになりCountOfMatchesます。NA0

merge(smaller_df, counts, all.x=TRUE)

このサンプルデータの場合、次のようになります。

> merge(smaller_df, counts, all.x=TRUE)
         Date CountOfMatches
1  2000-01-01              4
2  2000-01-02              2
3  2000-01-03              5
4  2000-01-04              4
5  2000-01-05              5
6  2000-01-06              6
7  2000-01-07              2
8  2000-01-08              5
9  2000-01-09              3
10 2000-01-10              3

編集:

パッケージ(変換の詳細の一部を取り除く便利な関数を提供する)を使用するより簡潔なバージョンは次のとおりです。

library("plyr")
merge(smaller_df, 
      ddply(larger_df, .(Date), summarise, CountOfMatches=length(Date)),
      all.x = TRUE)

同じ結果、そして事実上、同じロジック。また、に表示されない日付についても同じ注意が必要ですlarger_df

于 2012-12-06T22:56:19.907 に答える
4

data.table パッケージを使用してこれを行う方法があります。これは、大規模なデータセットをメモリ内で効率的に処理するためのパッケージであり、SQL に似た、または SAS データのステップに似た操作を可能にしますが、角括弧 [] は data.frame オブジェクトとは異なる動作をします。[] 内に data.table の結合、式、集計を配置できます。詳細については、data.table マニュアルを参照してください。

まず、2 つのフレームを data.table オブジェクトに変換し、キー列を Date に設定します。data.table オブジェクトは Date でソートされ、結合できます。

上記と同じサンプル データを使用します。

library(data.table)
smaller_df <- data.table(data.frame(Date=seq(as.Date("2000-01-01"), 
    as.Date("2000-01-10"), by="1 day")))
set.seed(5)
larger_df <- data.table(data.frame(Date=sample(seq(as.Date("2000-01-01"), 
    as.Date("2000-01-20"), by="1 day"), 80, replace=TRUE)))

キー列を日付に設定します。

setkey(smaller_df, Date)
setkey(larger_df, Date)

by-without-by 構文を使用して、日付でキーを設定したという事実を使用できます。.Nサブセット内の行数 (つまり、日付が一致する行数) を返します。

larger_df[smaller_df, .N]
##         Date   N
##  1: 2000-01-01 4
##  2: 2000-01-02 2
##  3: 2000-01-03 5
##  4: 2000-01-04 4
##  5: 2000-01-05 5
##  6: 2000-01-06 6
##  7: 2000-01-07 2
##  8: 2000-01-08 5
##  9: 2000-01-09 3
## 10: 2000-01-10 3
于 2012-12-06T23:42:54.623 に答える
4

かなり簡単に見えるのは次のとおりです。

smaller_df$bigDfCount <-sapply( smaller_df$Date,  
                        FUN=function(x) length(larger_df[larger_df$Date==x, "Date"] ) )
smaller_df

         Date bigDfCount
1  2000-01-01          4
2  2000-01-02          2
3  2000-01-03          5
4  2000-01-04          4
5  2000-01-05          5
6  2000-01-06          6
7  2000-01-07          2
8  2000-01-08          5
9  2000-01-09          3
10 2000-01-10          3
于 2012-12-07T02:35:24.410 に答える