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