我在下面有一个数据集的样本:
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
我想应用下面提供的百分比,并将每个百分比乘以指标1和指标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
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
答案 0 :(得分:2)
我认为您可以使用tidyr的crossing
。调整您的示例的结果是:
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)
希望这会有所帮助!