我想知道如何根据现有数据框中的数据创建新的百分比表。
这是我一直在使用的数据的示例:
@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,但这并不能提供我想要的输出
答案 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