r - 取百分比向量并乘以列
问题描述
我在下面有一个数据集示例:
Gran1 <- c('A','A'); Gran2 <- c('B', 'B'); Gran3 <-c('C','D'); Metric1 <- c(1500, 1700); Metric2 <- c(200, 50)
df <- data.frame(Gran1, Gran2, Gran3, Metric1, Metric2)
df
Gran1 Gran2 Gran3 Metric1 Metric2
A B C 1500 200
A B D 1700 50
我想应用下面提供的百分比并将每个百分比乘以 Metric 1 和 Metric 2 导致额外的行。这将使按组 Gran1、Gran2 和 Gran3 的数据更加细化。
percent=c(seq(0,8,by=.1),9:100)/100
percent
[1] 0.000 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 0.010 0.011 0.012 0.013 0.014 0.015 0.016 0.017 0.018 0.019 0.020 0.021 0.022 0.023 0.024 0.025 0.026
[28] 0.027 0.028 0.029 0.030 0.031 0.032 0.033 0.034 0.035 0.036 0.037 0.038 0.039 0.040 0.041 0.042 0.043 0.044 0.045 0.046 0.047 0.048 0.049 0.050 0.051 0.052 0.053
[55] 0.054 0.055 0.056 0.057 0.058 0.059 0.060 0.061 0.062 0.063 0.064 0.065 0.066 0.067 0.068 0.069 0.070 0.071 0.072 0.073 0.074 0.075 0.076 0.077 0.078 0.079 0.080
[82] 0.090 0.100 0.110 0.120 0.130 0.140 0.150 0.160 0.170 0.180 0.190 0.200 0.210 0.220 0.230 0.240 0.250 0.260 0.270 0.280 0.290 0.300 0.310 0.320 0.330 0.340 0.350
[109] 0.360 0.370 0.380 0.390 0.400 0.410 0.420 0.430 0.440 0.450 0.460 0.470 0.480 0.490 0.500 0.510 0.520 0.530 0.540 0.550 0.560 0.570 0.580 0.590 0.600 0.610 0.620
[136] 0.630 0.640 0.650 0.660 0.670 0.680 0.690 0.700 0.710 0.720 0.730 0.740 0.750 0.760 0.770 0.780 0.790 0.800 0.810 0.820 0.830 0.840 0.850 0.860 0.870 0.880 0.890
[163] 0.900 0.910 0.920 0.930 0.940 0.950 0.960 0.970 0.980 0.990 1.000
结果应如下所示:
Gran1 Gran2 Gran3 Metric1 Metric2 Percent M1*Percent M2*Percent
A B C 1500 200 0 0 0
A B C 1500 200 0.001 1.5 0.2
A B C 1500 200 0.002 3 0.4
A B C 1500 200 0.003 4.5 0.6
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
A B C 1500 200 0.990 1485 198
A B C 1500 200 1.000 1500 200
A B D 1700 50 0 0 0
A B D 1700 50 0.001 1.7 0.05
A B D 1700 50 0.002 3.4 0.10
A B D 1700 50 0.003 5.1 0.15
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
解决方案
我认为您可以crossing
从 tidyr 使用。调整您的示例会产生:
library(tidyr)
library(dplyr)
df1 <- data.frame(v1=c("A","B"), v2=c("C","D"), metric1=c(10,20), metric2=c(30,40))
df2 <- data.frame(percent=seq(0,100, by=10))
df <- crossing(df1, df2)
df %<>% mutate(p_metric1=metric1*percent, p_metric2=metric2*percent)
希望这可以帮助!
推荐阅读
- reactjs - 如何在博览会上反应原生导航时隐藏标题导航栏?
- github - 有没有办法将 Github README 视频链接包装在表格单元格中?
- jenkins - 詹金斯中的未知阶段部分“withKubeConfig”
- amazon-web-services - 从除当前设备之外的所有设备注销 AWS 放大
- bash - 我在 tsv 文件中的每个单元格有多个值,如何拆分它们并与另一列中的相应值匹配?
- python - polyglot - TypeError:'function'对象不可下标
- php - 在浏览器中工作,无法使用 PHP
- javascript - 上课时关闭模态,与另一个保持打开状态
- javascript - 如何在 lihthouse“减少未使用的 CSS”中解决此问题
- java - intx MaxJavaStackTraceDepth=-1 在启动 jack-server 时超出允许范围 [0 ... 1073741823]