R 将缺少的年份添加到数据框中(重塑)

R 将缺少的年份添加到数据框中(重塑),r,R,假设我有如下数据帧: df <- structure(list( year = c(2001, 2001, 2002, 2003, 2001, 2002, 2003), name = c("A", "B", "B", "B", "C", "C", "C"), revenue = c(10, 20, 30, 40, 30, 40, 50)), .typ

假设我有如下数据帧:

df <- structure(list( 
year = c(2001, 2001, 2002, 2003, 2001, 2002, 2003),
name = c("A", "B", "B", "B", "C", "C", "C"),
revenue = c(10, 20, 30, 40, 30, 40, 50)),
.typeOf = c("numeric", "factor", "numeric"),
row.names = c(NA, -7L),
class = "data.frame")
它工作得非常好,特别是对于小数据集,但是我不确定我的解决方案从编程的角度来看是否正确。使用
melt
cast(dcast)
或其他方法可能存在更好的解决方案。有什么想法吗


编辑:有什么想法吗?如何在/使用管道“%%>%”?

或者您可以使用
扩展.grid
唯一的
名称和年份,并
使用
all=TRUE
将它们合并到您的
df

merge(expand.grid(lapply(df[2:1], unique)), df, all=TRUE)
#  name year revenue
#1    A 2001      10
#2    A 2002      NA
#3    A 2003      NA
#4    B 2001      20
#5    B 2002      30
#6    B 2003      40
#7    C 2001      30
#8    C 2002      40
#9    C 2003      50

或者,您可以使用
unique
名称和年份的
expand.grid
,并使用
all=TRUE
将它们合并到您的
df

merge(expand.grid(lapply(df[2:1], unique)), df, all=TRUE)
#  name year revenue
#1    A 2001      10
#2    A 2002      NA
#3    A 2003      NA
#4    B 2001      20
#5    B 2002      30
#6    B 2003      40
#7    C 2001      30
#8    C 2002      40
#9    C 2003      50

data.table
中,您可以使用
dcast()
强制转换到广域,同时使用
drop=FALSE
创建完整的组集(保留空组)


data.table
中,您可以使用
dcast()
强制转换到广域,同时使用
drop=FALSE
创建完整的组集(保留空组)


另一个
数据表
选项:

library(data.table)
setDT(df)
df[CJ(year, name, unique = TRUE), on = c("year", "name")]

#    year name revenue
# 1: 2001    A      10
# 2: 2001    B      20
# 3: 2001    C      30
# 4: 2002    A      NA
# 5: 2002    B      30
# 6: 2002    C      40
# 7: 2003    A      NA
# 8: 2003    B      40
# 9: 2003    C      50

另一个
数据表
选项:

library(data.table)
setDT(df)
df[CJ(year, name, unique = TRUE), on = c("year", "name")]

#    year name revenue
# 1: 2001    A      10
# 2: 2001    B      20
# 3: 2001    C      30
# 4: 2002    A      NA
# 5: 2002    B      30
# 6: 2002    C      40
# 7: 2003    A      NA
# 8: 2003    B      40
# 9: 2003    C      50