代码之家  ›  专栏  ›  技术社区  ›  LLL

在R中基于两个因子级别插入行

r
  •  0
  • LLL  · 技术社区  · 7 年前

    我得到了一个数据帧(df),有四个变量,其中两个是因子var1和var2。var1和var2各有三个级别。

    一些var1和var2的组合在数据帧中不存在,例如var1 level“slow”没有var2 level“4或5”。

    我想将那些丢失的组合行添加到我的数据帧(dfgoal)中,并将其中的var3和var4设置为0。

    # Starting point 
    df <- data.frame(var1=c("fast","fast","fast","medium","slow","slow"),
                     var2=c("1 or 2","3","4 or 5","3","1 or 2","3"),
                     var3_freq=c(22,56,22,100,36,64),
                     var4_n=c(10,26,10,2,5,9))
    df$var1 <- as.factor(df$var1)
    df$var2 <- as.factor(df$var2)
    
    # Goal
    dfgoal <- data.frame(var1=c("1 or 2","3","4 or 5","1 or 2","3","4 or 5","1 or 2","3","4 or 5"),
                     var2=c("fast","fast","fast","medium","medium","medium","slow","slow","slow"),
                     var3_freq=c(22,56,22,0,100,0,36,64,0),
                     var4_n=c(10,26,10,0,2,0,5,9,0))
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Roman    7 年前

    无需加载外部库的简单解决方案:

        var1   var2 var3_freq var4_n
    1   fast 1 or 2        22     10
    2   fast      3        56     26
    3   fast 4 or 5        22     10
    4 medium      3       100      2
    5   slow 1 or 2        36      5
    6   slow      3        64      9
    7 medium 1 or 2         0      0
    8 medium 4 or 5         0      0
    9   slow 4 or 5         0      0
    

    代码

    new <- data.frame(var1 = c("medium", "medium", "slow"),
                      var2 = c("1 or 2", "4 or 5", "4 or 5"),
                      var3_freq = c(0, 0, 0),
                      var4_n = c(0, 0, 0))
    rbind(df, new)
    

    数据

    df <- data.frame(var1=c("fast","fast","fast","medium","slow","slow"),
                     var2=c("1 or 2","3","4 or 5","3","1 or 2","3"),
                     var3_freq=c(22,56,22,100,36,64),
                     var4_n=c(10,26,10,2,5,9))
    df$var1 <- as.factor(df$var1)
    df$var2 <- as.factor(df$var2)    
    
        2
  •  0
  •   lroha    7 年前

    complete() tidyr

    library(tidyr)
    complete(df, var2, var1, fill = list(var3_freq = 0, var4_n = 0))
    
      var2   var1   var3_freq var4_n
      <fct>  <fct>      <dbl>  <dbl>
    1 1 or 2 fast          22     10
    2 1 or 2 medium         0      0
    3 1 or 2 slow          36      5
    4 3      fast          56     26
    5 3      medium       100      2
    6 3      slow          64      9
    7 4 or 5 fast          22     10
    8 4 or 5 medium         0      0
    9 4 or 5 slow           0      0