【问题标题】:add column total to new row in data frame R将列总计添加到数据框 R 中的新行
【发布时间】:2018-10-27 20:10:13
【问题描述】:

假设我有以下数据。

 A <- c(4,4,4,4)
 B <- c(1,2,3,4)
 C <- c(1,2,4,4)
 D <- c(3,2,4,1)

data <- as.data.frame(rbind(A,B,C,D))
data <- t(data)
data <- as.data.frame(data)

> data
     A B C D
  V1 4 1 1 3
  V2 4 2 2 2
  V3 4 3 4 4
  V4 4 4 4 1

我希望在底部添加 2 行。我尝试了 rbind(data,colSums(data)) 但它给了我一个错误,而且我很难找到可以简单地添加一行的东西。

添加的第一行必须是每列中前 3 行的总和。 添加的第二行需要是每列中所有 4 行的总和。

所以输出应该是这样的:

    > data
          A  B  C  D
       V1 4  1  1  3
       V2 4  2  2  2
       V3 4  3  4  4
       V4 4  4  4  1
V1:V3Sum 12  6  7  9
V1:V4Sum 16 10 11 10

如果您想尝试一下,我会尝试获取相对频率,因此再添加 5 行。

1 行将对应于列 (V1:V4) 中的每个值除以 v1:v5Sum 值(4 行)。然后第 5 行将是 v1:v3Sum 除以 v1:v5Sum。

    > data
              A    B    C    D
           V1 4    1    1    3
           V2 4    2    2    2
           V3 4    3    4    4
           V4 4    4    4    1
    V1:V3Sum 12    6    7    9
    V1:V4Sum 16   10   11   10
relFreqV1   .25   .1   .09   .3     *each of these 4 rows is the value in
relFreqV2   .25   .2   .18   .2       row 1:4 divided by v1:v4Sum
relFreqV3   .25   .3   .36   .4 
relFreqV4   .25   .4   .36   .1
relFreqTot  .75  .6     .63   .9    * last row is v1:v3Sum divided by 
                                       V1:V4Sum

任何帮助都将不胜感激!!!

【问题讨论】:

  • 仅供参考,data &lt;- as.data.frame(rbind(A,B,C,D)); data &lt;- t(data); data &lt;- as.data.frame(data) 距离data.frame(A, B, C, D) 有很长的路要走。如果您需要这些特定的行名,请使用 row.names(data) = paste0("V", 1:nrow(data))

标签: r dplyr frequency cumsum summarize


【解决方案1】:

您可以通过多种方式完成此操作,包括一些更新且更“整洁”的方法,但是当解决方案在基础 R 中像这样简单时,我更喜欢这样的方法:

rbind(data, colSums(data[1:3,]),colSums(data))
    A  B  C  D
V1  4  1  1  3
V2  4  2  2  2
V3  4  3  4  4
V4  4  4  4  1
5  12  6  7  9
6  16 10 11 10

如果您希望行名与您想要的输出示例相匹配,那么这是 1 个选项:

data           <- rbind(data, colSums(data[1:3,]),colSums(data))
rownames(data) <- c("V1", "V2", "V3", "V4", "V1:V3Sum", "V1:V4Sum")
          A  B  C  D
V1        4  1  1  3
V2        4  2  2  2
V3        4  3  4  4
V4        4  4  4  1
V1:V3Sum 12  6  7  9
V1:V4Sum 16 10 11 10

相对频率

您要求多显示几行以反映汇总统计信息(相对频率)。我相信这就是您想要的:

rbind(data, 
      data[1,]/data[5,],
      data[2,]/data[5,],
      data[3,]/data[5,],
      data[4,]/data[5,],
      data[5,]/data[6,])
                   A          B          C          D
V1         4.0000000  1.0000000  1.0000000  3.0000000
V2         4.0000000  2.0000000  2.0000000  2.0000000
V3         4.0000000  3.0000000  4.0000000  4.0000000
V4         4.0000000  4.0000000  4.0000000  1.0000000
V1:V3Sum  12.0000000  6.0000000  7.0000000  9.0000000
V1:V4Sum  16.0000000 10.0000000 11.0000000 10.0000000
V11        0.3333333  0.1666667  0.1428571  0.3333333
V21        0.3333333  0.3333333  0.2857143  0.2222222
V31        0.3333333  0.5000000  0.5714286  0.4444444
V41        0.3333333  0.6666667  0.5714286  0.1111111
V1:V3Sum1  0.7500000  0.6000000  0.6363636  0.9000000

【讨论】:

  • 哈哈好吧,这太容易了。谢谢!!关于如何获得频率的任何建议? @Hack-R
  • @ElaineSlaven 是的 :) 如果这回答了您的问题,请检查绿色复选标记。我很高兴做频率,但我不是 100% 清楚你想要什么 - 你能在一个新问题中做一个想要的输出示例吗?如果你想把它放在这个问题中,我想也可以,不过
  • 出于某种原因,它不会让我再接受几分钟 - 但我会的!
  • @ElaineSlaven 请查看我的更新答案以了解相对频率。如果我误解了您想要的内容,请告诉我。
  • 有点乱,但效果很好,我没解决哈哈谢谢!!!
猜你喜欢
  • 2021-07-30
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多