首页 > 解决方案 > 数据表创建行

问题描述

我已经广泛研究了堆栈溢出,但找不到任何对我想要的输出有用的东西。

为了说明,请考虑以下示例数据框:

      D     X     Y     Z     A     B     C    Total
 1   abc    2     3     4     7     2     1      19

总计对应于每一行的总和。为简单起见,设 B=19,即总数。我想要的输出是:

    D     X     Y     Z     A     B     C    Total
 1  abc   1     2     3     4     5     2      B
 2  N/A   1/B   2/B   3/B   4/B   5/B   2/B    1

在这里,第一行中的每个元素除以总数,这反映在第二行中。要为总计创建一列,我使用了 mutate 并执行了以下操作:

df <- df %>% mutate(Total = X + Y + Z + A + B + C)

但是我无法弄清楚如何创建一个每个元素都可以被总数整除的行。

任何帮助,将不胜感激!我不介意使用 mutate 或 data.table 来执行此操作,因为我使用 data.table 创建了一个大数据框。

EDIT1:我真的很抱歉没有提到这一点,但一列包含一些字符串。我已经编辑了上面的内容以反映这一点。

标签: rdata.tabledplyr

解决方案


这是dplyr您的问题的答案。您实际想要做的可能更复杂,但这个简单bind_rows的 , filter, 和mutate_all适用于提供的简单示例。

library(dplyr)
df <- data.frame(x = 2:3, y = 3:4, z = letters[1:2], total = c(0, 19))
bind_rows(
    df,
    filter(df, row_number() == n()) %>%
        mutate_if(is.numeric, funs(. / total))
)

# x         y z total
# 1 2.0000000 3.0000000 a     0
# 2 3.0000000 4.0000000 b    19
# 3 0.1578947 0.2105263 b     1

推荐阅读