Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
453 views
in Technique[技术] by (71.8m points)

r - Expand Data Frame

I want to expand a data frame given some conditions. It is a bit similar to this question expand data frames inside data frame, but not quite the same.

I have a data frame:

df = data.frame(ID = c(3,3,3,3, 17,17,17, 74, 74, 210, 210, 210, 210), amount = c(101, 135, 101, 68,  196, 65 ,135, 76, 136, 15, 15, 15 ,15), week.number = c(4, 6, 8, 10, 2, 5, 7, 2, 6, 2, 3, 5, 6))

I want to expand the data frame for each ID, given a min and max week.number, and having 0 in the amount column for this expansion. Min week.number is 1 and max week.number is 10. The expected results would be:

df1 <- data.frame(ID = c(rep(3,10), rep(17, 10), rep(74, 10), rep(210, 10)),
              amount = c(0, 0, 0, 101, 0, 135, 0, 101, 0, 68, 0, 196,
                         0, 0, 65, 0, 135, 0, 0, 0, 0, 76, 0, 0, 0,
                         136, 0, 0, 0, 0, 0, 15, 15, 0, 15, 15, 0, 0,
                         0, 0))

(In reality, I have thousands of ID and week number goes from 1 to 160).

Is there a simple, fast way to do this?

Thank you!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Here's how you could do it using tidyr:

library(tidyr)
complete(df, ID, weeek.number = 1:10, fill = list(amount = 0))
#Source: local data frame [40 x 3]
#
#      ID weeek.number amount
#   (dbl)        (dbl)  (dbl)
#1      3            1      0
#2      3            2      0
#3      3            3      0
#4      3            4    101
#5      3            5      0
#6      3            6    135
#7      3            7      0
#8      3            8    101
#9      3            9      0
#10     3           10     68
#..   ...          ...    ...

An approach in base R would be to use expand.grid and merge:

newdf <- merge(expand.grid(ID = unique(df$ID), weeek.number = 1:10), df, all.x = TRUE)
newdf$amount[is.na(newdf$amount)] <- 0   # replace NA with 0

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...