【问题标题】:Apply calculation over data.frame values,store in new data.frame - R对 data.frame 值应用计算,存储在新的 data.frame - R
【发布时间】:2020-12-16 14:48:05
【问题描述】:
> l
  var1 var2 sum
a    1    0 1
b   56    6 62
c    5    4 9

我想做一些计算并使用计算值创建一个新的 data.frame。计算是将行的每个值除以总和,所以对于a 1/1 和 0/1。

我试过了

l.new <- apply(l,MARGIN = 2,FUN = function(x){x/l$sum})
#Error  in x/l$sum : non-numeric Argument for binary operator

l.new <- NULL
for(i in 1/ncol(l)){
  a <- i/l$rsum
  L2.rel <- rbind(L2.rel,a)
}
#this results in a strange data.frame...

所以澄清一下,我希望l 看起来像这样

  var1     var2    sum
a    1     0        1
b   0.903  0.067    62
c   0.556  0.444    9

我看过这个Apply a calculation over every column,但显然它不起作用

【问题讨论】:

  • cbind(l[1:2] / l[, 3], l[3])

标签: r dataframe loops


【解决方案1】:

您可以使用 mutate_at 的整洁方法:

library(tidyverse)

l %>% 
  mutate_at(vars(-sum), ~./sum)

或者你引用的应用函数:

l[,-3] <- lapply(l[,-3], function(x) x/l[,3])
l

【讨论】:

    【解决方案2】:

    您可以简单地进行除法,因为您已经有了 rowSums。下面的代码应该足够了

    cbind(l[1:2]/l[,3],l[3])
            var1         var2 sum
    a 1.000000000 0.0000000000   1
    b 0.903225806 0.0967741935  62
    c 0.555555556 0.4444444444   9
    

    如果您没有 sums 列,那么您可以这样做:

     cbind(l[1:2]/(sm <- rowSums(l[1:2])), sum = sm)
             var1         var2 sum
    a 1.000000000 0.0000000000   1
    b 0.903225806 0.0967741935  62
    c 0.555555556 0.4444444444   9
    

    最后,如果您只对比例感兴趣,那么您可以使用 prop.table

    prop.table(as.matrix(l[1:2]),1)
             var1         var2
    a 1.000000000 0.0000000000
    b 0.903225806 0.0967741935
    c 0.555555556 0.4444444444
    

    【讨论】:

    • 仅供未来读者参考:l 应该是 df,当它是 data.matrix 时,第一个解决方案不起作用。
    • @takeITeasy,您应该改用l[,1:2],无论它是df还是矩阵,它都会起作用
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多