【问题标题】:add column based on values in other columns data frame r根据其他列数据框r中的值添加列
【发布时间】:2016-11-18 03:49:23
【问题描述】:

我很好奇如何解决这个问题。我有这样的数据框:

a    b    
1    0    
1    0
0    1
1    1
0    0
1    0   

然后输出有一个基于“a”和“b”值的额外列:

如果(a==1&b==1)c=1,如果(a==1&b==0)c=2,如果(a==0&b==1)c=3,否则c=4。

a    b    c
1    0    2
1    0    2
0    1    3
1    1    1
0    0    4
1    0    2

有什么想法吗?我不会用嵌套的 if-else 编写 for 循环,我们怎么去向量化?谢谢!

【问题讨论】:

  • df$c=ifelse(df$a==1 &df$b==1, 1, ifelse(df$a==1 & df$b==0, 2, ifelse(df $a==0 & df$b==1, 3, 4)))
  • 好点!我完全忘记了这个......谢谢
  • 也请查看switch()
  • Base R 还是来自包?
  • df$c <- 4 - 2 * df$a - df$b

标签: r dataframe reshape


【解决方案1】:

interaction 就是为此而生的:

c(4,2,3,1)[interaction(df)]
#[1] 2 2 3 1 4 2

【讨论】:

  • 这非常简单。很好的发现!
【解决方案2】:

这也可以:

library(dplyr)
inner_join (df, cbind(expand.grid(0:1, 0:1), c=c(4, 2, 3, 1)), 
                by=c('a'='Var1', 'b'='Var2'))

  a b c
1 1 0 2
2 1 0 2
3 0 1 3
4 1 1 1
5 0 0 4
6 1 0 2

【讨论】:

    【解决方案3】:

    带一点线性代数:

    我们需要从方程 c = 4 - xa - yb 中求解 x,y 我们可以看到 x = 2, y = 1 是给定变量值集的解

     a  b c
     0  0 4
     1  0 2
     0  1 3
     1  1 1
    

    或者我们可以使用 limSolve 来求解这个超定方程组:

    library(limSolve)
    res <- Solve(as.matrix(expand.grid(0:1, 0:1)), 4-c(4, 2, 3, 1))
    res
    Var1 Var2  # a = Var1, b = Var2
       2    1
    

    因此,我们有:

    df$c <- 4 - res[1]*df$a - res[2]*df$b
    df
    a b c
    1 1 0 2
    2 1 0 2
    3 0 1 3
    4 1 1 1
    5 0 0 4
    6 1 0 2
    

    【讨论】:

      【解决方案4】:

      将所需的 c 值映射到向量并使用 a 和 b 值作为索引(对于基于 1 的索引,递增 1)。

      foo <- data.frame(a=c(1,1,0,1,0,1), b=c(0,0,1,1,0,0))
      
      data.frame(foo, c=c(4:1)[foo$a*2 + foo$b + 1])
      
      #   a b c
      # 1 1 0 2
      # 2 1 0 2
      # 3 0 1 3
      # 4 1 1 1
      # 5 0 0 4
      # 6 1 0 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 2022-08-13
        相关资源
        最近更新 更多