[英]Fill in Missing Weekly Data Points in R as 0 for Each ID
我有這種形狀的數據:
> head(posts)
id week_number num_posts
1 UKL1.1 1 4
2 UKL1.1 6 9
3 UKL1.2 1 2
4 UKL1.3 1 8
5 UKL1.3 2 7
6 UKL1.3 3 3
我想使每個id
在每個week_number
(1,2,3,4,5,6)中都有一行,如果數據中還沒有那個week_number
,那么posts
應該= 0
我已經看到了這個用包做zoo
與真正的時間序列數據,而無需創建一個適當的POSIXct
或Date
的版本week_number
,並使用該包裝是有沒有辦法直接做到這一點?
這是使用data.table
的方法。
library(data.table)
setDT(posts) # convert posts to a data.table
all.wks <- posts[,list(week_number=min(week_number):max(week_number)),by=id]
setkey(posts,id,week_number) # index on id and week number
setkey(all.wks,id,week_number) # index on id and week number
result <- posts[all.wks] # data.table join is very fast
result[is.na(num_posts),num_posts:=0] # convert NA to 0
result
# id week_number num_posts
# 1: UKL1.1 1 4
# 2: UKL1.1 2 0
# 3: UKL1.1 3 0
# 4: UKL1.1 4 0
# 5: UKL1.1 5 0
# 6: UKL1.1 6 9
# 7: UKL1.2 1 2
# 8: UKL1.3 1 8
# 9: UKL1.3 2 7
# 10: UKL1.3 3 3
其他方式:
my_fun <- function(x) {
weeks = with(x, min(week_number):max(week_number))
posts = with(x, num_posts[match(weeks, week_number)])
list(week_number=weeks, num_posts=posts)
}
setDT(posts)[, my_fun(.SD), by=id]
.SD
表示數據的子集; 它包含對應於規定的各組的子集的數據by
,與不包括分組列=所有的列id
。
然后,您可以如上所述替換NA
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.