【问题标题】:Calculate one value based on the sum of other values within one dataframe根据一个数据帧内其他值的总和计算一个值
【发布时间】:2012-11-08 01:34:40
【问题描述】:

我正在尝试在 R 中解决这个问题,虽然我知道我现在已经在 Excel 中完成了,但我真的很想学习如何使用 R。

我的数据框如下所示:

 OBJECTID CDUID SENSI_FINA FREQUENCY SUM_LENGTH

        6  5915          1        51      19178

        7  5915          2        97      21536

        8  5915          3       201      35640

        9  5915          4       551     170549

       10  5915          5       308     145126

       11  5917          1       210      28104

       12  5917          2      1897     249379

现在我想将SUM_LENGTHCDUID 相加,然后计算SUM_LENGTHSENSI_FINAL=5SUM_LENGTHCDUID 之和的百分比

简单来说,我想这样做:

(145123/(19178+21536+35640+170549))*100

CDUID = 5915,然后是下一个 5917 等等。

到目前为止,我所做的是根据 CDUID 计算总和:

CDlenght <- aggregate(step1$SUM_LENGTH~step1$CDUID, data=step1, sum)

但现在我被卡住了...:-(

【问题讨论】:

  • + 1 例如数据和您尝试过的内容。

标签: r dataframe


【解决方案1】:

我会为此使用data.tableddply

library(plyr)

DT2 <- ddply(step1, .(CDUID), mutate, percent = 100* SUM_LENGTH / sum(SUM_LENGTH))

 subset(DT2, SENSI_FINA == 5)
##   OBJECTID CDUID SENSI_FINA FREQUENCY SUM_LENGTH percent
## 5       10  5915          5       308     145126 37.0192

我觉得data.table语法更优雅,内存效率更高

library(data.table)
DT <- data.table(step1)

DT[,percent :=  100* SUM_LENGTH / sum(SUM_LENGTH), by = CDUID][SENSI_FINA == 5]

:=DT 中通过引用分配(因此percent 列现在将位于DT

【讨论】:

  • 完美!太棒了,我从来没有听说过那个包data.table。我会确保我阅读了该软件包的描述,这听起来对我的分析很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 2018-01-09
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
相关资源
最近更新 更多