【问题标题】:Handling missing combinations of factors in R处理 R 中缺少的因子组合
【发布时间】:2012-06-08 18:59:13
【问题描述】:

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

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

我该怎么做呢?

提前致谢,

伊恩

【问题讨论】:

    标签: r


    【解决方案1】:

    使用您的数据:

    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,表示缺失。然后用0s 替换这些NAs 非常简单:

    > 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
    

    【讨论】:

    • @user1443010 在该行中,我使用它来避免dat$f1dat$f2。我也认为它的意图很明确;使用 this 对象,执行 that。这在用户层面没有任何问题,但是会降低效率,因为 R 必须使用对象的内容创建一个新环境,这需要时间。 dat2 &lt;- expand.grid(f1 = levels(dat$f1), f2 = levels(dat$f2)) 将是替代方案。你不能总是把事情变成with();我不认为替换NA 的行可以轻松转换为with(),但我可能会遗漏一些东西。
    【解决方案2】:

    我添加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 %&gt;% spread(f1, v1, fill=0) %&gt;% gather(f1, v1, -f2)

    【讨论】:

      【解决方案3】:

      晚了两年,但我遇到了同样的问题并想出了这个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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多