R或dplyr/tidyr:计算值占小计的百分比

R或dplyr/tidyr:计算值占小计的百分比,r,dplyr,tidyr,dcast,R,Dplyr,Tidyr,Dcast,让我们以空气质量数据集为基础 myaqm <- melt(airquality, id=c("Month", "Day"), na.rm = TRUE) 但是,我正在尝试为每个当前数字列创建一个附加变量“-天数百分比”-小计列。所以我的目标是: Day variable 5 5(day %) 6 6(day %) 7 7(day %) 8 8(day %) 9

让我们以空气质量数据集为基础

myaqm <- melt(airquality, id=c("Month", "Day"), na.rm = TRUE)
但是,我正在尝试为每个当前数字列创建一个附加变量“-天数百分比”-小计列。所以我的目标是:

Day     variable        5       5(day %)        6       6(day %)        7       7(day %)        8       8(day %)        9       9(day %)        (all)       (all)(day %)
1       Ozone       41      13.4%       0       0.0%        135     27.4%       39      18.6%       96      26.6%       311     17.9%
1       Solar.R     190     62.2%       286     76.8%       269     54.7%       83      39.5%       167     46.3%       995     57.2%
1       Wind        7.4     2.4%        8.6     2.3%        4.1     0.8%        6.9     3.3%        6.9     1.9%        33.9        1.9%
1       Temp        67      21.9%       78      20.9%       84      17.1%       81      38.6%       91      25.2%       401     23.0%
1       (all)       305.4       100.0%      372.6       100.0%      492.1       100.0%      209.9       100.0%      360.9       100.0%      1740.9      100.0%
2       Ozone       36      15.4%       0       0.0%        49      12.5%       9       7.0%        78      21.0%       172     11.5%
2       Solar.R     118     50.4%       287     77.4%       248     63.4%       24      18.8%       197     52.9%       874     58.4%
2       Wind        8       3.4%        9.7     2.6%        9.2     2.4%        13.8        10.8%       5.1     1.4%        45.8        3.1%
2       Temp        72      30.8%       74      20.0%       85      21.7%       81      63.4%       92      24.7%       404     27.0%
2       (all)       234     100.0%      370.7       100.0%      391.2       100.0%      127.8       100.0%      372.1       100.0%      1495.8      100.0%
抱歉,格式太糟糕了!但正如您希望看到的,新的附加列给出了当天和当月每个变量的百分比


我发现另一个堆栈溢出助手建议使用tidyr和dplyr,但我无法根据自己的需要调整它们的示例。有人能告诉我怎么做吗?

我编写了一个百分比函数,并将其与dplyr一起使用。然后我把这些柱子连接在一起

pct <- function(x) {x/sum(x)}

df <- myaqm_dcast %>%
  filter(variable != "(all)") %>%
  group_by(Day) %>%
  mutate_each(funs(pct), 3:8) %>%
  inner_join(myaqm_dcast, by = c("Day", "variable"))
编辑:您可以修改百分比功能进行打印,但需要*100,粘贴%符号


编辑2:如果你可以不使用所有行,我已经过滤掉了。您始终可以使用summary_each函数计算列和。

为什么要重新调整数据?Dataframe myaqm满足的要求是每列是一个变量,每行是一个观察值。您可以使用以下格式进行计算:

library(dplyr)
myaqm %>%
  group_by(Day, variable) %>%
  mutate(all = sum(value),
     perc = paste0(round(100 * value/all, 2), "%")
即使是创建绘图(例如通过ggplot),这种格式也比重塑的格式更适合

如果确实需要,您可以使用tidyr/dplyr重塑:

...
gather(key, val, -c(Month:variable, all)) %>%
unite(temp, Month, key) %>%
spread(temp, val)

如果将每一列除以第8列,这将是正确的答案——但这不是问题所在。对于每一列,您必须每5行循环一次并除以所有。所以首先你必须按列5,6,7,8,9全部融化,然后再除以行,谢谢你的黑暗面。Ryan的答案似乎有效,因为我得到了六个新的列,其中的小数与我的示例中的百分比相匹配。谢谢Ryan!,不过,我希望你能详细解释一下你的解释。我唯一想添加的是我必须使用:pct这是因为Ryan的解决方案将4个变量中的每一个的值与all行相加,这意味着总值除以它应该是的值的两倍。不是在pct函数中乘以2,而是可以在每一行变异前插入slice-n。是的,我错过了原始答案中的所有行。很抱歉。@Ryan作为“pct”函数的进一步细化,假设我们想从所有函数的总和中排除风,但仍然希望将其计算为另一个%。也就是说,all==臭氧+太阳能.R+温度,但我们仍然提供了风/all的百分比。我们如何在pct内执行排除?另外,我应该问一个新问题吗?谢谢你的帮助,但是看起来你的百分比是基于给定日期和给定变量的所有月份的总和,而不是给定月份中给定日期的变量总和。对于您的问题,您为什么要重塑数据?让我解释一下客户的意思,因为我付钱让你以那种形式给我。再次感谢你的帮助!
library(dplyr)
myaqm %>%
  group_by(Day, variable) %>%
  mutate(all = sum(value),
     perc = paste0(round(100 * value/all, 2), "%")
...
gather(key, val, -c(Month:variable, all)) %>%
unite(temp, Month, key) %>%
spread(temp, val)