【问题标题】:Conditional "blind" splitting of data in RR中数据的条件“盲”拆分
【发布时间】: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


    【解决方案1】:

    所以我认为这里的诀窍就是把你的代码从测试公司变成一个函数,然后在列表中循环。类似的东西

    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)
    

    【讨论】:

      【解决方案2】:

      让我给你看一些dplyr,我建议你阅读更多。

      library(dplyr)
      data(iris)
      

      在这里,您将group_by 您的分组变量,然后使用summarise 应用一些功能。我将使用mean,但这可以由您在 Daniels 的回答中定义。

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

      【讨论】:

        猜你喜欢
        • 2021-04-01
        • 1970-01-01
        • 2019-08-07
        • 2023-01-22
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 1970-01-01
        相关资源
        最近更新 更多