当数据已经存在于某些行(R)中时,获取数据帧中的每个组合

当数据已经存在于某些行(R)中时,获取数据帧中的每个组合,r,reshape2,R,Reshape2,我最近刚刚使用dcast(在重塑2包中)将数据帧从长格式压缩到宽格式(因为我需要计数)。现在,我需要用0填充不存在的组合。我想我可以在基本包中使用expand.grid做一些事情,但我不确定如何(?),因为我不仅想要每个组合,而且我已经有了一些计数。我所拥有的一个例子: AgeGroup Sex Month Count 10 F 2 4 10 F 6 1 11 M 6 2 我想要的是: AgeGroup Sex Mont

我最近刚刚使用dcast(在重塑2包中)将数据帧从长格式压缩到宽格式(因为我需要计数)。现在,我需要用0填充不存在的组合。我想我可以在基本包中使用expand.grid做一些事情,但我不确定如何(?),因为我不仅想要每个组合,而且我已经有了一些计数。我所拥有的一个例子:

AgeGroup Sex Month Count 
10       F   2     4
10       F   6     1
11       M   6     2
我想要的是:

AgeGroup Sex Month Count
10       F   2     4
10       F   3     0
10       F   4     0 
10       F   5     0
10       F   6     1
根据阿纳达的评论编辑:

最小可再现数据/代码:

library(reshape2)

Sex <- c('M', 'F', 'F', 'F', 'M')
County <- c(41, 65, 35, 49, 41)
AgeGroup <- c(11, 10, 18, 11, 11)
Month <- c(1, 1, 2, 4, 1)
Count <- rep(1, 5)
DF <- cbind.data.frame(Sex, County, AgeGroup, Month, Count)

DF <-dcast(DF, County+Sex+Month+AgeGroup~Count, 
           value.var="Count", length)

names(DF)[names(DF)=='1'] <- 'Count'
library(重塑2)

Sex这里有一个使用base R的解决方案。如果
df
是您的数据帧,您可以尝试:

    res<-expand.grid(lapply(df[,1:3],unique))
    res$Count<-0
    res$Count[match(do.call(paste,df[,1:3]),do.call(paste,res[,1:3]))]<-df$Count
res这里有一个(快速)
data.table
解决方案(假设您的数据名为
df

库(data.table)
setkey(setDT(df)、年龄组、性别、月份)#对数据集进行排序/键入以备将来合并

库姆斯如果我正确理解你的要求,我相信你可以用哈德利·威克姆的另一个软件包做到这一点:
plyr

使用
ddply
功能并指定
.drop=F

尝试:


使用
expand.grid
生成所有组合,然后使用
merge
也许更好的选择是返回代码。在适当的
因素上使用
dcast
,这些因素具有您想要的所有
级别
,应该允许您保留您感兴趣的一切。你能发布一些原始数据样本和你用来获取上面第一个表的代码吗?谢谢阿南达-我现在提供了一个例子。这个代码对我来说不太合适,但我会研究ddply,谢谢
library(data.table)
setkey(setDT(df), AgeGroup, Sex, Month) # Sorting/keying your data set for future merge
combs <- df[, CJ(unique(AgeGroup), unique(Sex), seq_len(max(Month)))] # CJ is data.tables equivalent expand.grid, but more efficient 
final <- df[combs] # Merging
final[is.na(Count), Count := 0] # Setting all missing combinations to zero
final
#     AgeGroup Sex Month Count
#  1:       10   F     1     0
#  2:       10   F     2     4
#  3:       10   F     3     0
#  4:       10   F     4     0
#  5:       10   F     5     0
#  6:       10   F     6     1
#  7:       10   M     1     0
#  8:       10   M     2     0
#  9:       10   M     3     0
# 10:       10   M     4     0
# 11:       10   M     5     0
# 12:       10   M     6     0
# 13:       11   F     1     0
# 14:       11   F     2     0
# 15:       11   F     3     0
# 16:       11   F     4     0
# 17:       11   F     5     0
# 18:       11   F     6     0
# 19:       11   M     1     0
# 20:       11   M     2     0
# 21:       11   M     3     0
# 22:       11   M     4     0
# 23:       11   M     5     0
# 24:       11   M     6     2
ddply(df, .(AgeGroup, Sex, Month),length, .drop = F)