【问题标题】:R: Building function to calculate % relative frequency and apply them over all columnsR:计算百分比相对频率并将它们应用于所有列的构建函数
【发布时间】:2020-03-03 02:05:37
【问题描述】:

我是 R 的初学者,在构建函数时遇到了一些问题...

我的数据如下所示。

我想构建一个函数,以便可以将表中的所有值转换为每列的相对频率百分比。

例如,对于第一列,我想将该列中的所有值除以该列的列总和 (colSum)。

然后,我想在所有列中重复这一点。

有什么我可以研究的功能吗? 我尝试了应用功能,但我无法让它工作。

谢谢你:)

【问题讨论】:

  • 假设矩阵为m:t(t(m) / colSums(m))

标签: r


【解决方案1】:

使用apply函数,你可以做到:

apply(df,2, function(x) x/sum(x)*100)

在这里,我创建了这个虚拟示例来说明它是如何工作的:

 df <- data.frame(C1 = sample(1:100,5),
                   C2 = sample(1:100,5),
                   C3 = sample(1:100,5))

apply(df,2, function(x) x/sum(x)*100)

            C1        C2       C3
[1,] 32.903226 13.861386 19.59799
[2,] 27.096774  1.980198 16.33166
[3,]  3.870968 44.554455 17.58794
[4,] 15.483871 17.821782 21.85930
[5,] 20.645161 21.782178 24.62312  

使用dplyr包,你可以使用mutate_all得到相同的输出:

library(dplyr)
df %>% mutate_all(.funs = ~./sum(.)*100)

         C1        C2       C3
1 32.903226 13.861386 19.59799
2 27.096774  1.980198 16.33166
3  3.870968 44.554455 17.58794
4 15.483871 17.821782 21.85930
5 20.645161 21.782178 24.62312

它回答了你的问题吗?

【讨论】:

  • 完美运行 :)) 非常感谢!
【解决方案2】:

另一个base R 选项可能是:

sweep(df, 2, FUN = `/`, colSums(df))*100

【讨论】:

  • 不错!我不知道sweep 函数;)
  • @dc37 我认为sweep() 是最被低估的base 函数之一。它提供了很多:)
  • 我可以看到。我很好奇sweep 相对于apply 函数的优缺点。我将不得不进一步了解它。
  • @dc37 在这种情况下显然不是更好,但是在您有一个预定义的向量想要应用于特定列/行的情况下,它真的很棒。
  • 感谢您的提示;)。我会将它添加到我的工具箱中
【解决方案3】:

我们可以复制colSums 以在base R 中进行除法之前保持长度相同

df/colSums(df)[col(df)] * 100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2021-02-14
    • 2017-02-15
    • 2020-09-07
    • 2021-03-22
    相关资源
    最近更新 更多