7

私は次のようなデータフレームを使用しています。

date<-c("2012-02-01", "2012-02-01", "2012-02-03", "2012-02-04", "2012-02-04", "2012-02-05", "2012-02-09", "2012-02-12", "2012-02-12")
var<-c("a","b","c","d","e","f","g","h","i")
df1<-data.frame(date,var)

毎日の観測数を表にした2番目のデータフレームを作成したいと思います。そのデータフレームでは、言及されていない日付はゼロになります...結果は次のようになります。

date<-c("2012-02-01","2012-02-02","2012-02-03","2012-02-04","2012-02-05","2012-02-06","2012-02-07","2012-02-08","2012-02-09","2012-02-10","2012-02-11","2012-02-12")
num<-c(2,0,1,2,1,0,0,0,1,0,0,2)
df2<-data.frame(date,num)

集計関数を使用していくつかのことを試しましたが、観測値(ゼロ)のない日付を含める方法がわかりません。

4

3 に答える 3

2

ここで使用するアプローチdata.table

library(data.table)
DF1 <- as.data.table(df1)
# coerce date to a date object
DF1[, date := as.IDate(as.character(date), format = '%Y-%m-%d')]
# setkey for joining
setkey(DF1, date)

# create a data.table that matches with a data.table containing
# a sequence from the minimum date to the maximum date
# nomatch = NA includes those non-matching. 
# .N is the number of rows in the subset data.frame
# this is 0 when there are no matches 
DF2 <- DF1[J(DF1[,seq(min(date), max(date), by = 1)]), .N, nomatch = NA]
DF2

          date N
 1: 2012-02-01 2
 2: 2012-02-02 0
 3: 2012-02-03 1
 4: 2012-02-04 2
 5: 2012-02-05 1
 6: 2012-02-06 0
 7: 2012-02-07 0
 8: 2012-02-08 0
 9: 2012-02-09 1
10: 2012-02-10 0
11: 2012-02-11 0
12: 2012-02-12 2

を使用したアプローチreshape2::dcast

date集計したい毎日のレベルが列にあることを確認した場合

df1$date <- with(df1, factor(date, levels = as.character(seq(min(as.Date(as.character(date))), max(as.Date(as.character(date))), by = 1 ))))


df2 <- dcast(df1, date~., drop = FALSE)
于 2012-10-30T00:55:55.293 に答える
0

私は最近このようなものを扱いました。検討したいすべての日付を含むデータフレームを作成し、merge()関数を使用して提案したことを実行します。

df1$date <- as.Date(df1$date, format = "%Y-%m-%d")
newdates <- data.frame(date=seq(as.Date('2012-02-01'),as.Date('2012-02-12'),1))
df2 <- merge(df1, newdates, by = "date", all = TRUE)

ここall = TRUEで重要なのは、これらのインスタンスを削除する代わりに、一致しないNA場所df1と一致しない場所を紹介することです。df2

次に、plyrパッケージを使用してカウントを取得します。

library(plyr)
ddply(df2, "date", function(x) sum(!is.na(x$var)))

df2これは、の一意の値によってグループに分割され、でなかったdf2$date値の数を見つけて、その数値とその一意の値が表す値を返します。df2$varNAdf2$date

于 2012-10-30T00:59:17.927 に答える
0

インデックスをPostxct形式に変換してから、次のようにします。

counts <- data.frame(table(as.Date(index(my_data_frame))))

于 2016-06-29T15:46:54.170 に答える