处理R中缺少的因子组合

时间:2012-06-08 18:59:13

标签: r

所以,我有一个包含两个因子和一个数字变量的数据框,如下所示:

>D
f1 f2 v1 
1   A  23
2   A  45
2   B  27
     .
     .
     .

所以f1的水平是1和2,f2的水平是A和B.这就是f1 = 1和f2 = B时输入的值(即D $ V1 [D $ f1] = 1& D $ f2 = B]不存在)实际上这应该是零。

在我的实际数据框中,我有11个级别的f1和接近150个级别的f2,我需要为我的数据帧中缺少的f1和f2的每个组合创建一个v1 = 0的观察。

我将如何做到这一点?

提前致谢,

伊恩

3 个答案:

答案 0 :(得分:12)

使用您的数据:

dat <- data.frame(f1 = factor(c(1,2,2)), f2 = factor(c("A","A","B")),
                  v1 = c(23,45,27))

一个选项是创建一个包含级别组合的查找表,这是使用随两个因素的级别提供的expand.grid()函数完成的,如下所示:

dat2 <- with(dat, expand.grid(f1 = levels(f1), f2 = levels(f2)))

然后可以使用merge()函数执行类似数据库的连接操作,我们在该函数中指定查找表中的所有值都包含在连接中(all.y = TRUE

newdat <- merge(dat, dat2, all.y = TRUE)

以上行产生:

> newdat
  f1 f2 v1
1  1  A 23
2  1  B NA
3  2  A 45
4  2  B 27

如您所见,缺失的组合被赋予值NA,表示缺失。用NA s替换这些0是非常简单的:

> newdat$v1[is.na(newdat$v1)] <- 0
> newdat
  f1 f2 v1
1  1  A 23
2  1  B  0
3  2  A 45
4  2  B 27

答案 1 :(得分:4)

我添加tidyr解决方案,使用fill=0传播并收集。

library(tidyr)
df %>% spread(f2, v1, fill=0) %>% gather(f2, v1, -f1)

#  f1 f2 v1
#1  1  A 23
#2  2  A 45
#3  1  B  0
#4  2  B 27

您同样可以df %>% spread(f1, v1, fill=0) %>% gather(f1, v1, -f2)

答案 2 :(得分:1)

迟了两年,但我遇到了同样的问题并想出了这个plyr解决方案:

dat <- data.frame(f1 = factor(c(1,2,2)), f2 = factor(c("A","A","B")), v1 = c(23,45,27))

newdat <- ddply(dat, .(f1,f2), numcolwise(function(x) {if(length(x)>0) x else 0.0}), .drop=F)

> newdat
  f1 f2 v1
1  1  A 23
2  1  B  0
3  2  A 45
4  2  B 27