r - 在R中的数据集中以相等的间隔计算总数的百分比

标签 r percentage calculated-columns

我正在处理一个数据集,其中包含每个 FMCG 类别的总数以及每个主要 channel 的销售分布,如列中所示。摘录如下

CTY  totsal MTsal   GTsal   Othsal  totsal  MTsal   GTsal   Othsal
     food   food    food    food    deo      deo    deo      deo
Arg  47313  19620   15052   12641   178      113    41       24
Aus  143140 85172   4634    53334   459      438    5        16
Bel  125399 82966   7818    34614   424      229    5        190

在我的输出数据集中,我想计算每 4 列中的总类别组的份额,例如totsal 食物和totsal deo。因此,这些份额必须为 1,而 channel 的份额加起来必须是它们各自的值(value)。我正在查看的示例输出是:

CTY totshar MTshar  GTshar  Othshar totshar MTshar  GTshar  Othshar
    food    food    food    food    deo      deo    deo      deo
Arg  1      0.4     0.3     0.3     1.0      0.6    0.2      0.1
Aus  1      0.6     0.0     0.4     1.0      1.0    0.0      0.0
Bel  1      0.7     0.1     0.3     1.0      0.5    0.0      0.4

上面的例子是一个摘录,我需要灵活地包含尽可能多的类别和国家。

最佳答案

你可以这样做。 首先,我复制并粘贴了您的数据:

d <- read.table("clipboard",header=T)
d
   CTY totsal MTsal GTsal Othsal totsal.1 MTsal.1 GTsal.1 Othsal.1
1 <NA>   food  food  food   food      deo     deo     deo      deo
2  Arg  47313 19620 15052  12641      178     113      41       24
3  Aus 143140 85172  4634  53334      459     438       5       16
4  Bel 125399 82966  7818  34614      424     229       5      190

然后我将数字转换为数字矩阵

m <- data.frame(d[-1, -1])
m <- t(apply(m, 1, function(x) as.numeric(as.character(x))))
m
    [,1]  [,2]  [,3]  [,4] [,5] [,6] [,7] [,8]
2  47313 19620 15052 12641  178  113   41   24
3 143140 85172  4634 53334  459  438    5   16
4 125399 82966  7818 34614  424  229    5  190

我使用 grep 搜索了总列数,并创建了一个索引 gr对于列组。值得注意的是,total列必须始终是组的第一列。组值的总数可以变化。

gr_total <- grep("tot", colnames(d)[-1])
gr <- sort(rep(gr_total, 4))

我用了sapply计算每组的百分比并使用 matrix 转换结果功能。 sapply 函数“循环”遍历 grep 找到的所有组搜索。 function(x, y, z)内它子集属于该组的所有列。此处为先m[, gr == gr_total[1]] .因为 R 针对矢量化过程进行了优化,所以您可以将矢量/矩阵除以矢量。尝试 m[, gr == gr_total[1]]/m[ , gr_total[1]] .对于 matrix()功能请看?matrix并检查 sapply输出。

matrix(sapply(gr_total, function(x, y, z)  z[, y==x]/z[, x], gr, m), nrow(m), ncol(m), byrow = FALSE)
     [,1]      [,2]       [,3]      [,4] [,5]      [,6]       [,7]       [,8]
[1,]    1 0.4146852 0.31813666 0.2671782    1 0.6348315 0.23033708 0.13483146
[2,]    1 0.5950258 0.03237390 0.3726003    1 0.9542484 0.01089325 0.03485839
[3,]    1 0.6616161 0.06234499 0.2760309    1 0.5400943 0.01179245 0.44811321

您可以使用 round函数四舍五入一位数。假设您将结果保存在 m1 中使用 round(m1, 1) . Colnames 可以替换为 colnames(m1) <- colnames(d)[-1] .要添加列和行,请参阅 rbindcbind .

关于r - 在R中的数据集中以相等的间隔计算总数的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38094087/

相关文章:

r - typeof 为显然是一个因素的东西返回整数

python - 计算百分比差异python

mysql - 如何查询给定固定值的值的百分比

rowMeans 如果列名是数字

sql - 使用一列的值作为另一列(SQL Server)?

mysql - 计算列的 SQL View

删除 R 中列的最后一个下划线之后的所有内容

r - 如何使用 Anova 命令进行 Tukey HSD 测试(汽车包)

r - 在 R 中迭代复合返回(如 Excel 乘积函数)

html - 无法移动带有百分比的 div 最高值