10

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

>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 的观察。

我该怎么做呢?

提前致谢,

伊恩

4

3 回答 3

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表示缺失的值。然后用 s 替换这些NAs非常简单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
于 2012-06-08T19:12:51.187 回答
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)

于 2016-10-16T21:10:56.807 回答
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
于 2015-08-26T13:51:04.237 回答