创建可自定义的n维数组

时间:2018-01-12 00:57:17

标签: arrays r lapply n-dimensional

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

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

为了将其与其他数据结合起来,我尝试做的是创建一个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. 我的同心for循环甚至不能成为填充阵列的最佳方式,我想知道是否有人知道是什么。
  3. 你会推荐什么?

1 个答案:

答案 0 :(得分:0)

我制作了一些数据

# 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列中生成如下所示的内容。每个名称和所有因素组合的所有Exposure值的总和。

# 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维数组,请使用acastfactor1 ~ factor2 ~ factor3等公式查看~。{/ p>

# 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)