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