有条件的"盲目"在R

时间:2016-10-27 15:39:52

标签: r

我有一个棘手的问题(至少在我看来是棘手的......)条件分割我的数据的问题:

我的数据包含不同年份的一些公司的销售信息。公司可以通过变量" UNR"中的不同数字来识别。我对公司的销售数据特别感兴趣,可以在变量" urs_5ef16u1&#34 ;; " 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的最小值和最大值,然后找出sales-variable的相应值。第一步与tapply()split()一起使用,但是一旦我进入下一步,我就会陷入困境 - 主要是因为以下问题:我的数据非常严格的保密要求,这样我才能真正地看到#34; rawdata,但必须盲目地工作"。我刚刚获得了一个虚拟数据文件(如上所示)来创建我的R代码,将其发送给数据所有者,然后数据所有者将运行代码并返回结果。因此,我不能使用离散的变量值,但必须使用带索引等的向量。

我尝试了以下方式,使用split()

> splitted <- split(daten.ready, daten.ready[["UNR"]]) 
> # split dataframe in subsets, one for each company

对于&#34;测试公司&#34;,例如与UNR&#34; 3769&#34;下一步很简单:

> 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

我现在如何&#34;自动化&#34;这对于每个公司而言都不知道离散的UNR?我创建了一个带有split-subsets数字的向量来通过索引访问它们,然后使用迭代:

> 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()或任何其他功能?我也宁愿避免迭代,因为原始数据帧会非常庞大​​......

非常感谢!

2 个答案:

答案 0 :(得分:0)

所以我认为这里的技巧只是将你的代码从测试公司转变为一个函数,然后通过列表循环。像

这样的东西
compound <- function(x) {
    t_min_ind_3769 <- which.min(x$urs_5ef16u2)
    t_max_ind_3769 <- which.max(x$urs_5ef16u2)
    t_min_3769 <- min(x$urs_5ef16u2)
    t_max_3769 <- max(x$urs_5ef16u2)

    (((x[(t_max_ind_3769),10]/x[(t_min_ind_3769),10]) ^(1/(t_max_3769-t_min_3769)))-1)
}

然后用

循环遍历列表
sapply(splitted, compound)

答案 1 :(得分:0)

让我向您展示一些dplyr,我建议您阅读更多相关内容。

library(dplyr)
data(iris)

此处您将group_by您的分组变量,然后使用summarise来应用某些功能。我将使用mean,但这可以由你在Daniels的答案中定义。

means <- iris %>%
  group_by(Species) %>%
  summarise(avg = mean(Sepal.Length))