代码之家  ›  专栏  ›  技术社区  ›  Daniel V

创建可自定义的n维数组

  •  0
  • Daniel V  · 技术社区  · 7 年前

    这是两个问题合一;如果我要把它们分开,请告诉我。

    我有一个人力资源数据的电子表格,我将把它切割成不同的横截面。每一行当前代表一名员工、该特定报告的年份(例如,在三年期间,一名员工会出现三次,一列包括该行所指的年份)以及一系列其他特征。此外,我还添加了一个字段,该字段显示该员工在该期间代表的全职员工数量,该字段表示该员工面临的风险。

    为了将其与其他数据结合起来,我正在尝试创建一个n维数组,其中每个点表示与维度匹配的总风险敞口。在我使用的示例中,维度是年份、公司[有一对夫妇]、年龄段、性别、部门、任期段。

    为此,我编写了以下代码:

    FactorNames <- c("FY","HR Business", "Age Band", "Gender", "Classification Level 1", "Tenure Band")
    FactorDim <- lapply(length,mapply(unique,HR[FactorNames]))
    Names <- lapply(HR[FactorNames], function(x)sort(unique(x)))
    
     Index <- 1
     for (Ten in 1:FactorDim[6]){
       for (Job in 1:FactorDim[5])  {
         for (Sex in 1:FactorDim[4]) {
           for (Age in 1:FactorDim[3]) {
             for (Co in 1:FactorDim[2]) {
               for (Year in 1:FactorDim[1]) {
                 ExpList[Index] = sum(subset(HR,
                                             HR$FY == Names[1,Year],
                                             HR$`HR Business` == Names[2, Co],
                                             HR$`Age Band` == Names[3, Age],
                                             HR$Gender == Names[4, Sex],
                                             HR$`Classification Level 1` ==  Names[5,Job],
                                             HR$`Tenure Band` == Names[6,Ten],
                                             select=Exposure),
                                      na.rm=TRUE)
                 Index <- Index + 1
               }
             }
           }
         }
       }
     }
    

    有两个主要问题。

    1. Names <- lapply(HR[FactorNames], function(x)sort(unique(x))) 不正确,因为 lapply(HR[FactorNames], function(x)sort(unique(x))) 将唯一值作为单个组合元素而不是向量返回。这意味着 for 循环引发错误 Error in Names[1, Year] : incorrect number of dimensions .
    2. 我的同心圆 对于 循环几乎是填充数组的最佳方式,我想知道是否有人知道是什么。

    你有什么建议吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Will    7 年前

    我编造了一些数据

    # make fake data
    FactorNames <- c("FY","HR Business", "Age Band", "Gender", "Classification Level 1", "Tenure Band")
    d <- as.data.frame(lapply(FactorNames,function(x){paste(x,sample(1:3,6,replace=T))}))
    names(d) <- FactorNames
    d$Name <- c('z','y','x','w','v','z')
    d$Exposure <- randu[1:6,1]
    

    据我所知,for循环打算在 d$sum_val 柱名称和所有因素的每个组合的所有暴露值的总和。

    # get sum
    library(dplyr) # %>% pipe, group_by, and summarize
    d %>% 
     group_by(Name, FY, `HR Business`, `Age Band`, Gender, `Classification Level 1`, `Tenure Band`) %>% 
     summarize(sum_val = sum(Exposure))
    

    要生成n维数组,请查看 acast 公式如下 factor1 ~ factor2 ~ factor3 具有 ~ 对于每个dim。

    # lazy way to write out each of the factors
    quoteFN <- lapply(c('Name',FactorNames),sprintf,fmt='`%s`')
    concatFN <- paste(collapse=" ~ ", quoteFN )
    
    # collapse into array
    out <- reshape2::acast(d, as.formula(concatFN),value.var='Exposure',sum)
    
    # what does it look like
    dimnames(out)
    dim(out)