【问题标题】:dividing columns by another column dplyr R将列除以另一列 dplyr R
【发布时间】:2019-12-14 11:19:37
【问题描述】:

我在桌子上这样做:

tmp %>%
mutate(sum_onCPA = rowSums(select(., setdiff(colnames(.),NON_CPA_VARIABLES)))) %>%
mutate_at(vars(CPA_A01: CPA_U), (./ sum_onCPA))

所以我想将每列 CPA_A01 到 CPA_U(65 列)除以列上的总和 (sum_onCPA),但我得到了错误

Error in is_fun_list(.funs) : object 'sum_onCPA' not found

有什么想法吗?

【问题讨论】:

    标签: r dplyr divide


    【解决方案1】:

    您可以调用 .$sum_onCPA:

    set.seed(100)
    tmp = data.frame(matrix(runif(25),ncol=5))
    NON_CPA_VARIABLES = c("X1","X5")
    
    tmp = tmp %>% 
    mutate(sum_onCPA = rowSums(select(., setdiff(colnames(.),NON_CPA_VARIABLES)))) 
    

    你可以的

    tmp %>% mutate_at(vars(X2:X4),function(i)i/.$sum_onCPA)
    

    感谢@ronakshah,他指出了一个更简洁的版本:

    tmp %>% mutate_at(vars(X2:X4),~.x/sum_onCPA)
    
              X1        X2        X3        X4        X5 sum_onCPA
    1 0.30776611 0.2721193 0.3515583 0.3763224 0.5358112  1.777789
    2 0.25767250 0.4277649 0.4644980 0.1077371 0.7108038  1.899180
    3 0.55232243 0.3673089 0.2780738 0.3546173 0.5383487  1.008199
    4 0.05638315 0.4189724 0.3054667 0.2755609 0.7489722  1.304522
    5 0.46854928 0.1048991 0.4698105 0.4252905 0.4201015  1.623104
    

    我们可以使用base R sweep来检查上面是否正确:

    tmp[,c("X2","X3","X4")] = sweep(tmp[,c("X2","X3","X4")],1,tmp$sum_onCPA,"/")
    tmp
                  X1        X2        X3        X4        X5 sum_onCPA
    1 0.30776611 0.2721193 0.3515583 0.3763224 0.5358112  1.777789
    2 0.25767250 0.4277649 0.4644980 0.1077371 0.7108038  1.899180
    3 0.55232243 0.3673089 0.2780738 0.3546173 0.5383487  1.008199
    4 0.05638315 0.4189724 0.3054667 0.2755609 0.7489722  1.304522
    5 0.46854928 0.1048991 0.4698105 0.4252905 0.4201015  1.623104
    

    【讨论】:

    • true @RonakShah,感谢您的指出,是的,它有效。好的,我编辑我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2017-01-19
    • 2016-06-20
    • 2012-01-05
    • 2016-05-28
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多