如何基于现有数据在R中创建百分比表?

时间:2019-08-19 14:31:22

标签: r

我想知道如何根据现有数据框中的数据创建新的百分比表。

这是我一直在使用的数据的示例:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Qualifier
@interface Value {
    @Nonbinding String value() default "";
}

public class ValueProducer {
    @Produces
    @Value
    @Default
    public String produceValue(InjectionPoint ip) {
        Value val = ip.getAnnotated().getAnnotation(Value.class);
        // get the value somehow, for this example we return value provided with annotation
        return val.value();
    }
}

public class Abst1 extends AbstractAbst {
    @Inject
    public Abst1 (@Value("value1") String someCommonString) {
        super(someCommonString);
    }
}

public class Abst2 extends AbstractAbst {
    @Inject
    public Abst2 (@Value("value2") String someCommonString) {
        super(someCommonString);
    }
}

这是我的代码示例的输出:

Sample All 1  2  3  4
1 E1   250 29 27 11 18
2 E2   210 36 24 28 21
3 E3   130 29 10 12 23
4 E4   140 33 24 22 14
5 E5   220 27 16 19 18

我正在尝试计算3:5列中所有值与2列中的值的百分比。

这是我想要的输出结果:

dd <- data.frame(
  Sample = c("E1", "E2", "E3", "E4", "E5"), 
  `All` = c(250, 210, 130, 140, 220), 
  `1` = c(29, 36, 29, 33, 27), 
  `2` = c(27, 24, 10, 24, 16), 
  `3` = c(11, 28, 12, 22, 19), 
  `4` = c(18, 21, 27, 14, 18),
  check.names=FALSE
)

我尝试使用prop.table,但这并不能提供我想要的输出

2 个答案:

答案 0 :(得分:2)

您只需提取列并自己进行划分即可自己构建数据框架。例如

data.frame(dd[,1:2], dd[,-(1:2)]/dd[,2] * 100, check.names=FALSE)
#   Sample All        1         2         3         4
# 1     E1 250 11.60000 10.800000  4.400000  7.200000
# 2     E2 210 17.14286 11.428571 13.333333 10.000000
# 3     E3 130 22.30769  7.692308  9.230769 20.769231
# 4     E4 140 23.57143 17.142857 15.714286 10.000000
# 5     E5 220 12.27273  7.272727  8.636364  8.181818

这里我们取前两列,然后取所有其他列除以第二列乘以100。

答案 1 :(得分:2)

您可以在dplyr中使用mutate_at来选择要更改的列,并提供~ 100*./All的匿名函数(要转换为函数的公式)。

library(dplyr)

dd %>% 
  mutate_at(as.character(1:4), ~ 100*./All) 

#   Sample All        1         2         3         4
# 1     E1 250 11.60000 10.800000  4.400000  7.200000
# 2     E2 210 17.14286 11.428571 13.333333 10.000000
# 3     E3 130 22.30769  7.692308  9.230769 20.769231
# 4     E4 140 23.57143 17.142857 15.714286 10.000000
# 5     E5 220 12.27273  7.272727  8.636364  8.181818