R用向量划分数据帧

时间:2018-03-14 09:18:59

标签: r

我有一个名为cohort_table的数据帧表:

   CohortPeriod 2009-01 2009-02 2009-03 2009-04 2009-05 2009-06 2009-07 2009-08 2009-09 2009-10 2009-11 2009-12 2010-01 2010-02
1             1      22      15      13      39      50      32      50      31      37      54     130      65      95     100
2             2       8       3       4      13      13      15      23      11      15      17      32      17      50      19
3             3      10       5       5      10      12       9      13       9      14      12      26      18      26      NA
4             4       9       1       4      13       5       6      10       7       8      13      29       7      NA      NA
5             5      10       4       1       6       4       7      11       6      13      13      13      NA      NA      NA
6             6       8       4       2       7       6       5      10       8       9       7      NA      NA      NA      NA
7             7       8       4       2       4       3       3      11       4       8      NA      NA      NA      NA      NA
8             8       7       5       3       6       5       3       7       4      NA      NA      NA      NA      NA      NA
9             9       7       5       2       2       5      10       7      NA      NA      NA      NA      NA      NA      NA
10           10       7       4       1       4       4       3      NA      NA      NA      NA      NA      NA      NA      NA
11           11       7       3       3       3       3      NA      NA      NA      NA      NA      NA      NA      NA      NA
12           12       8       3       2       2      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
13           13      11       5       1      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
14           14       7      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
15           15       6      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
   2010-03
1       24
2       NA
3       NA
4       NA
5       NA
6       NA
7       NA
8       NA
9       NA
10      NA
11      NA
12      NA
13      NA
14      NA
15      NA

我有另一个名为cohort_group_size的数据框:

# A tibble: 15 x 2
# Groups:   CohortGroup [15]
   CohortGroup InitialGroupSize
   <chr>                  <int>
 1 2009-01                   22
 2 2009-02                   15
 3 2009-03                   13
 4 2009-04                   39
 5 2009-05                   50
 6 2009-06                   32
 7 2009-07                   50
 8 2009-08                   31
 9 2009-09                   37
10 2009-10                   54
11 2009-11                  130
12 2009-12                   65
13 2010-01                   95
14 2010-02                  100
15 2010-03                   24

基本上,我试图将cohort_table除以cohort_group_size。请注意,cohort_group_size CohortGroup列与cohort_table的标题具有相同的标签。

例如,2009-01的InitialGroupSize为22.我想取22并将整个列2009-01在cohort_table中除以22.等等,每个列都是如此。

在Python Pandas中,存在索引的概念,所以当cohort_group_size是Pandas系列时我可以执行以下操作:

cohort_table / cohort_group_size

CohortGroup    2009-01   2009-02   2009-03   2009-04  2009-05  2009-06  \
CohortPeriod                                                             
1             1.000000  1.000000  1.000000  1.000000     1.00  1.00000   
2             0.363636  0.200000  0.307692  0.333333     0.26  0.46875   
3             0.454545  0.333333  0.384615  0.256410     0.24  0.28125   
4             0.409091  0.066667  0.307692  0.333333     0.10  0.18750   
5             0.454545  0.266667  0.076923  0.153846     0.08  0.21875   
6             0.363636  0.266667  0.153846  0.179487     0.12  0.15625   
7             0.363636  0.266667  0.153846  0.102564     0.06  0.09375   
8             0.318182  0.333333  0.230769  0.153846     0.10  0.09375   
9             0.318182  0.333333  0.153846  0.051282     0.10  0.31250   
10            0.318182  0.266667  0.076923  0.102564     0.08  0.09375   
11            0.318182  0.200000  0.230769  0.076923     0.06      NaN   
12            0.363636  0.200000  0.153846  0.051282      NaN      NaN   
13            0.500000  0.333333  0.076923       NaN      NaN      NaN   
14            0.318182       NaN       NaN       NaN      NaN      NaN   
15            0.272727       NaN       NaN       NaN      NaN      NaN   

CohortGroup   2009-07   2009-08   2009-09   2009-10   2009-11   2009-12  \
CohortPeriod                                                              
1                1.00  1.000000  1.000000  1.000000  1.000000  1.000000   
2                0.46  0.354839  0.405405  0.314815  0.246154  0.261538   
3                0.26  0.290323  0.378378  0.222222  0.200000  0.276923   
4                0.20  0.225806  0.216216  0.240741  0.223077  0.107692   
5                0.22  0.193548  0.351351  0.240741  0.100000       NaN   
6                0.20  0.258065  0.243243  0.129630       NaN       NaN   
7                0.22  0.129032  0.216216       NaN       NaN       NaN   
8                0.14  0.129032       NaN       NaN       NaN       NaN   
9                0.14       NaN       NaN       NaN       NaN       NaN   
10                NaN       NaN       NaN       NaN       NaN       NaN   
11                NaN       NaN       NaN       NaN       NaN       NaN   
12                NaN       NaN       NaN       NaN       NaN       NaN   
13                NaN       NaN       NaN       NaN       NaN       NaN   
14                NaN       NaN       NaN       NaN       NaN       NaN   
15                NaN       NaN       NaN       NaN       NaN       NaN   

CohortGroup    2010-01  2010-02  2010-03  
CohortPeriod                              
1             1.000000     1.00      1.0  
2             0.526316     0.19      NaN  
3             0.273684      NaN      NaN  
4                  NaN      NaN      NaN  
5                  NaN      NaN      NaN  
6                  NaN      NaN      NaN  
7                  NaN      NaN      NaN  
8                  NaN      NaN      NaN  
9                  NaN      NaN      NaN  
10                 NaN      NaN      NaN  
11                 NaN      NaN      NaN  
12                 NaN      NaN      NaN  
13                 NaN      NaN      NaN  
14                 NaN      NaN      NaN  
15                 NaN      NaN      NaN  

上面的表格是所需的输出。来自Python,没有使用Indices,我不确定如何将系列/向量中的除法应用于数据帧,尤其是在这种情况下,因为列名称跨越标题,并且此数据框包含要从除法中排除的列{ {1}}。

1 个答案:

答案 0 :(得分:1)

以下是一个在readData.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { Thread readValThread = new Thread(readValDaemon); readValThread.setDaemon(true); readValThread.start(); } }); 中使用的非常相似的方法示例:


R

那就是说,这不是一种非常“# Create a dataframe from the example provided cohort_table <- read.table(text = " CohortPeriod 2009-01 2009-02 2009-03 2009-04 2009-05 2009-06 2009-07 2009-08 2009-09 2009-10 2009-11 2009-12 2010-01 2010-02 2010-03 1 1 22 15 13 39 50 32 50 31 37 54 130 65 95 100 24 2 2 8 3 4 13 13 15 23 11 15 17 32 17 50 19 NA 3 3 10 5 5 10 12 9 13 9 14 12 26 18 26 NA NA 4 4 9 1 4 13 5 6 10 7 8 13 29 7 NA NA NA 5 5 10 4 1 6 4 7 11 6 13 13 13 NA NA NA NA 6 6 8 4 2 7 6 5 10 8 9 7 NA NA NA NA NA 7 7 8 4 2 4 3 3 11 4 8 NA NA NA NA NA NA 8 8 7 5 3 6 5 3 7 4 NA NA NA NA NA NA NA 9 9 7 5 2 2 5 10 7 NA NA NA NA NA NA NA NA 10 10 7 4 1 4 4 3 NA NA NA NA NA NA NA NA NA 11 11 7 3 3 3 3 NA NA NA NA NA NA NA NA NA NA 12 12 8 3 2 2 NA NA NA NA NA NA NA NA NA NA NA 13 13 11 5 1 NA NA NA NA NA NA NA NA NA NA NA NA 14 14 7 NA NA NA NA NA NA NA NA NA NA NA NA NA NA 15 15 6 NA NA NA NA NA NA NA NA NA NA NA NA NA NA") # Setup column names to match the example. Note that R dislikes '-' in names # and that names should not start with a number. You can, however, force it # for the sake of making them match. colnames(cohort_table) <- gsub("X", "", colnames(cohort_table)) colnames(cohort_table) <- gsub("[.]", "-", colnames(cohort_table)) rownames(cohort_table) <- cohort_table$CohortPeriod # Create a dataframe from the example provided cohort_group <- read.table(text = " CohortGroup InitialGroupSize 1 2009-01 22 2 2009-02 15 3 2009-03 13 4 2009-04 39 5 2009-05 50 6 2009-06 32 7 2009-07 50 8 2009-08 31 9 2009-09 37 10 2009-10 54 11 2009-11 130 12 2009-12 65 13 2010-01 95 14 2010-02 100 15 2010-03 24") # IMPORTANT: set up the rownames of the cohort_group to match the month # This means that you can index the df based on the month, matching the # rownames: e.g. cohort_group["2009-01",] rownames(cohort_group) <- cohort_group$CohortGroup # R will divide vectors rowwise, so transpose the cohort_table # divide by the vector of values (cohort_group$InitialGroupSize) # then transpose back into a table. Note that this requires the # columns in cohort_table to be in the same order as the rows of # cohort_group. t(t(cohort_table) / cohort_group$InitialGroupSize) #> CohortPeriod 2009-01 2009-02 2009-03 2009-04 2009-05 #> 1 0.04545455 1.46666667 1.15384615 0.33333333 0.78000000 1.56250000 #> 2 0.13333333 0.61538462 0.07692308 0.08000000 0.40625000 0.26000000 #> 3 0.23076923 0.25641026 0.10000000 0.15625000 0.20000000 0.38709677 #> 4 0.10256410 0.18000000 0.03125000 0.08000000 0.41935484 0.13513514 #> 5 0.10000000 0.31250000 0.08000000 0.03225806 0.16216216 0.07407407 #> 6 0.18750000 0.16000000 0.12903226 0.05405405 0.12962963 0.04615385 #> 7 0.14000000 0.25806452 0.10810811 0.03703704 0.03076923 0.04615385 #> 8 0.25806452 0.18918919 0.09259259 0.02307692 0.09230769 0.05263158 #> 9 0.24324324 0.12962963 0.03846154 0.03076923 0.02105263 0.05000000 #> 10 0.18518519 0.05384615 0.06153846 0.01052632 0.04000000 0.16666667 #> 11 0.08461538 0.10769231 0.03157895 0.03000000 0.12500000 0.13636364 #> 12 0.18461538 0.08421053 0.03000000 0.08333333 0.09090909 NA #> 13 0.13684211 0.11000000 0.20833333 0.04545455 NA NA #> 14 0.14000000 0.29166667 NA NA NA NA #> 15 0.62500000 0.27272727 NA NA NA NA #> 2009-06 2009-07 2009-08 2009-09 2009-10 2009-11 #> 1 0.64000000 1.61290323 0.83783784 0.68518519 0.4153846 2.0000000 #> 2 0.48387097 0.62162162 0.20370370 0.11538462 0.2615385 0.3368421 #> 3 0.24324324 0.24074074 0.06923077 0.21538462 0.1263158 0.2600000 #> 4 0.11111111 0.07692308 0.10769231 0.08421053 0.1300000 1.2083333 #> 5 0.05384615 0.16923077 0.06315789 0.13000000 0.5416667 0.5909091 #> 6 0.07692308 0.10526316 0.08000000 0.37500000 0.3181818 NA #> 7 0.03157895 0.11000000 0.16666667 0.36363636 NA NA #> 8 0.03000000 0.29166667 0.18181818 NA NA NA #> 9 0.41666667 0.31818182 NA NA NA NA #> 10 0.13636364 NA NA NA NA NA #> 11 NA NA NA NA NA NA #> 12 NA NA NA NA NA NA #> 13 NA NA NA NA NA NA #> 14 NA NA NA NA NA NA #> 15 NA NA NA NA NA NA #> 2009-12 2010-01 2010-02 2010-03 #> 1 0.6842105 0.950000 4.1666667 1.090909 #> 2 0.1700000 2.083333 0.8636364 NA #> 3 0.7500000 1.181818 NA NA #> 4 0.3181818 NA NA NA #> 5 NA NA NA NA #> 6 NA NA NA NA #> 7 NA NA NA NA #> 8 NA NA NA NA #> 9 NA NA NA NA #> 10 NA NA NA NA #> 11 NA NA NA NA #> 12 NA NA NA NA #> 13 NA NA NA NA #> 14 NA NA NA NA #> 15 NA NA NA NA # If you aren't sure that the columns and rows will match exactly # then you can reorder cohort_group by indexing it on the column names # of cohort_table. Any column that doesn't have a correspoing row in # cohort group will be divided by NA and so be all NA. t(t(cohort_table) / cohort_group[colnames(cohort_table), "InitialGroupSize"]) #> CohortPeriod 2009-01 2009-02 2009-03 2009-04 2009-05 2009-06 #> 1 NA 1.0000000 1.00000000 1.00000000 1.00000000 1.00 1.00000 #> 2 NA 0.3636364 0.20000000 0.30769231 0.33333333 0.26 0.46875 #> 3 NA 0.4545455 0.33333333 0.38461538 0.25641026 0.24 0.28125 #> 4 NA 0.4090909 0.06666667 0.30769231 0.33333333 0.10 0.18750 #> 5 NA 0.4545455 0.26666667 0.07692308 0.15384615 0.08 0.21875 #> 6 NA 0.3636364 0.26666667 0.15384615 0.17948718 0.12 0.15625 #> 7 NA 0.3636364 0.26666667 0.15384615 0.10256410 0.06 0.09375 #> 8 NA 0.3181818 0.33333333 0.23076923 0.15384615 0.10 0.09375 #> 9 NA 0.3181818 0.33333333 0.15384615 0.05128205 0.10 0.31250 #> 10 NA 0.3181818 0.26666667 0.07692308 0.10256410 0.08 0.09375 #> 11 NA 0.3181818 0.20000000 0.23076923 0.07692308 0.06 NA #> 12 NA 0.3636364 0.20000000 0.15384615 0.05128205 NA NA #> 13 NA 0.5000000 0.33333333 0.07692308 NA NA NA #> 14 NA 0.3181818 NA NA NA NA NA #> 15 NA 0.2727273 NA NA NA NA NA #> 2009-07 2009-08 2009-09 2009-10 2009-11 2009-12 2010-01 #> 1 1.00 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 #> 2 0.46 0.3548387 0.4054054 0.3148148 0.2461538 0.2615385 0.5263158 #> 3 0.26 0.2903226 0.3783784 0.2222222 0.2000000 0.2769231 0.2736842 #> 4 0.20 0.2258065 0.2162162 0.2407407 0.2230769 0.1076923 NA #> 5 0.22 0.1935484 0.3513514 0.2407407 0.1000000 NA NA #> 6 0.20 0.2580645 0.2432432 0.1296296 NA NA NA #> 7 0.22 0.1290323 0.2162162 NA NA NA NA #> 8 0.14 0.1290323 NA NA NA NA NA #> 9 0.14 NA NA NA NA NA NA #> 10 NA NA NA NA NA NA NA #> 11 NA NA NA NA NA NA NA #> 12 NA NA NA NA NA NA NA #> 13 NA NA NA NA NA NA NA #> 14 NA NA NA NA NA NA NA #> 15 NA NA NA NA NA NA NA #> 2010-02 2010-03 #> 1 1.00 1 #> 2 0.19 NA #> 3 NA NA #> 4 NA NA #> 5 NA NA #> 6 NA NA #> 7 NA NA #> 8 NA NA #> 9 NA NA #> 10 NA NA #> 11 NA NA #> 12 NA NA #> 13 NA NA #> 14 NA NA #> 15 NA NA ”的做事方式。更好的方法是使数据采用整齐的格式(每个变量一行)。因此,您的R会有列:cohort_tableCohortPeriodCohortGroup。然后,您可以根据value合并cohort_tablecohort_group数据框并执行除法。


CohortGroup