【发布时间】:2016-10-27 15:39:51
【问题描述】:
我的数据有条件拆分有一个棘手的问题(至少在我看来是棘手的......):
我的数据包含有关不同年份的一堆公司的销售信息。这些公司可以通过变量“UNR”中的不同数字来识别。我对公司的销售数据特别感兴趣,可以在变量“urs_5ef16u1”中找到; “urs_5ef16u2”给出了测量销售数据的相应年份。所有公司和所有测量年份的所有数据都在一个数据框中:
> str(daten.ready)
'data.frame': 2570 obs. of 23 variables:
$ UNR : num 2578 3769 3769 3769 3769 ...
$ urs_jahr : num 2006 2013 2004 2008 2012 ...
$ urs_1ef17 : num 2005 1995 1995 1995 1995 ...
$ urs_1ef19 : num 1 1 2 2 2 1 1 1 1 1 ...
$ urs_1ef20 : num 55300 45100 50100 45100 45100 47500 47500 47500 47200 52200 ...
$ urs_1ef25 : num NA NA NA NA NA NA NA NA NA NA ...
$ urs_1ef26 : num 1 1 1 1 1 6 6 6 1 1 ...
$ urs_1ef30u4 : num NA NA NA NA NA NA NA NA NA NA ...
$ urs_5ef15u1 : num 0 0 0 0 0 0 0 0 0 0 ...
$ urs_5ef16u1 : num 34 122 323 244 194 349 146 142 149 59 ...
$ urs_5ef16u2 : num 2004 2011 2002 2006 2010 ...
$ urs_5ef18u1 : num 1 4 NA NA NA NA NA NA NA NA ...
$ urs_5ef18u2 : num 2004 2011 2002 2006 2010 ...
$ urs_5ef20u1 : num 1012001 NA NA NA NA ...
$ urs_5ef20u2 : num NA NA NA NA 1011996 ...
$ urs_5ef21u1 : num NA NA NA NA NA NA NA NA NA NA ...
$ urs_5ef21u2 : num NA NA NA NA NA ...
$ urs_5ef30u1 : num 34 122 NA NA 194 349 146 142 149 59 ...
$ urs_5ef30u2 : num 2004 2011 NA NA 2010 ...
$ urs_teilnahme : num 1111110 1111111 1111111 1111111 1111111 ...
$ urs_teilnak : num 1111110 2222222 2222222 2222222 2222222 ...
$ urs_teilnak01b: num 0 1111111 1111111 1111111 1111111 ...
$ u_ums_akt : num 0 0 0 0 0 0 0 0 0 0 ...
我需要使用以下公式计算每家公司的复合年增长率:
*CAGR = (A(t_max)/A(t_min))^ (1/n)) – 1 * 100% 其中 A(t_min) = 时间 t_min 的销售额; A(t_max) = 时间 t_max 的销售额; n = t_max-t_min.*
因此,我需要首先将数据框拆分为仅包含一家公司信息的子集,然后为每个公司提取 t 的最小值和最大值,然后找出销售变量的对应值。第一步适用于tapply() 或split(),但一旦我进入下一步我就卡住了 - 主要是因为以下问题:我的数据具有非常严格的保密要求,所以我不会能够真正“看到”原始数据,但必须“盲目地”工作。我刚刚获得了一个虚拟数据文件(如上所示)来创建我的 R 代码,将其发送给数据所有者,然后他们将运行代码并返回结果。因此我不能使用变量的离散值,但必须使用带有索引等的向量。
我尝试了以下方式,使用split():
> splitted <- split(daten.ready, daten.ready[["UNR"]])
> # split dataframe in subsets, one for each company
对于“测试公司”,例如带有 UNR "3769" 的下一步将很容易:
> t_min_ind_3769 <- which.min(splitted$"3769"$urs_5ef16u2)
> t_max_ind_3769 <- which.max(splitted$"3769"$urs_5ef16u2)
> t_min_3769 <- min(splitted$"3769"$urs_5ef16u2)
> t_max_3769 <- max(splitted$"3769"$urs_5ef16u2)
> cagr_3769 <- (((splitted$"3769"[(t_max_ind_3769),10]/splitted$"3769"[(t_min_ind_3769),10]) ^ (1/(t_max_3769-t_min_3769)))-1)
> cagr_3769
[1] -0.1025351
我现在如何在不知道离散 UNR 的情况下为每家公司“自动化”此操作?我创建了一个带有拆分子集数量的向量,以通过索引访问它们,然后使用迭代:
> unique_rownr <- which(!duplicated(daten.ready[["UNR"]]))
> # create a vector with rownumbers containing unique UNR
> unique_unr <- daten.ready[unique_rownr,1]
> # create a vector with unique UNR
对于我的测试公司,它看起来像这样:
> t_min_ind_3769 <- which.min(splitted[[unique_rownr[2]]][["urs_5ef16u2"]])
> t_max_ind_3769 <- which.max(splitted[[unique_rownr[2]]][["urs_5ef16u2"]])
> t_min_3769 <- min(splitted[[unique_rownr[2]]][["urs_5ef16u2"]])
> t_max_3769 <- max(splitted[[unique_rownr[2]]][["urs_5ef16u2"]])
> cagr_3769 <- (((splitted[[unique_rownr[2]]][(t_max_ind_3769),10]/splitted[[unique_rownr[2]]][(t_min_ind_3769),10]) ^ (1/(t_max_3769-t_min_3769)))-1)
> cagr_3769
[1] -0.1025351
到这里为止一切正常。但是我在尝试创建循环时遇到了困难:
> for (i in unique_rownr)
+ { t_min_ind_i <- which.min(splitted$unique_rownr[i][["urs_5ef16u2"]]);
+ t_max_ind_i <- which.max(splitted[[unique_rownr[i]]][["urs_5ef16u2"]]);
+ t_min_i <- min(splitted[[unique_rownr[i]]][["urs_5ef16u2"]]);
+ t_max_i <- max(splitted[[unique_rownr[i]]][["urs_5ef16u2"]]);
+ cagr_i <- (((splitted[[unique_rownr[i]]][(t_max_ind_i),10]/splitted[[unique_rownr[i]]][(t_min_ind_i),10]) ^ (1/(t_max_i-t_min_i)))-1)
+ }
Error in splitted[[unique_rownr[i]]] : subscript out of bounds
对我来说,我使用向量访问子集的技巧似乎不起作用......或者是其他地方的错误?如果我在这里的正确方式,或者是否有更简单的方法来解决我的问题,例如与tapply() 或subset() 或任何其他功能?我也宁愿避免迭代,因为原始数据框会非常大......
非常感谢!
【问题讨论】:
标签: r