代码之家  ›  专栏  ›  技术社区  ›  Micael Salomon

根据特定列的值乘以值

  •  1
  • Micael Salomon  · 技术社区  · 7 年前

    我有两个数据库,df和cf。我想根据表df中B和C的值,将df中A的每个值乘以cf中的每个系数。

    例如 df A=20 B=4和C=2中的第2行,因此正确的系数为0.3, 结果是20*0.3=6

    在R!中有一种简单的方法可以做到这一点!?

    提前谢谢!!

     df
        A  B  C
       20  4  2
       30  4  5
       35  2  2
       24  3  3
       43  2  1
    
    
       cf
          C
     B/C  1   2   3   4   5
     1   0.2 0.3 0.5 0.6 0.7
     2   0.1 0.5 0.3 0.3 0.4
     3   0.9 0.1 0.6 0.6 0.8
     4   0.7 0.3 0.7 0.4 0.6
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   LyzandeR    7 年前

    一个解决方案 apply :

    #iterate over df's rows
    apply(df, 1, function(x) {
    
     x[1] * cf[x[2], x[3]]
    
    })
    #[1]  6.0 18.0 17.5 14.4  4.3
    
        2
  •  1
  •   989    7 年前

    尝试此矢量化:

    df[,1] * cf[as.matrix(df[,2:3])]
    
    #[1]  6.0 18.0 17.5 14.4  4.3
    
        3
  •  0
  •   AntoniosK    7 年前

    解决方案使用 dplyr 和矢量化函数:

    df = read.table(text = "
                    A  B  C
                    20  4  2
                    30  4  5
                    35  2  2
                    24  3  3
                    43  2  1
                    ", header=T, stringsAsFactors=F)
    
    cf = read.table(text = "
                    0.2 0.3 0.5 0.6 0.7
                    0.1 0.5 0.3 0.3 0.4
                    0.9 0.1 0.6 0.6 0.8
                    0.7 0.3 0.7 0.4 0.6
                    ")
    
    library(dplyr)
    
    # function to get the correct element of cf
    # vectorised version
    f = function(x,y) cf[x,y]
    f = Vectorize(f)
    
    df %>%
      mutate(val = f(B,C),
             result = val * A)
    
    #    A B C val result
    # 1 20 4 2 0.3    6.0
    # 2 30 4 5 0.6   18.0
    # 3 35 2 2 0.5   17.5
    # 4 24 3 3 0.6   14.4
    # 5 43 2 1 0.1    4.3
    

    最终数据集同时具有 result val 以检查 cf 每次都使用。