簡體   English   中英

對於每個ID,將R中缺少的每周數據點填寫為0

[英]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與真正的時間序列數據,而無需創建一個適當的POSIXctDate的版本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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM