创建可自定义的 n 维数组
Creating a customisable n dimension array
这是两个合二为一的问题;如果我应该拆分它们,请告诉我。
我有一份 HR 数据电子表格,我打算将它分成不同的横截面。目前每一行代表一名员工、该特定报告的年份(例如,在三年期间,一名员工会出现三次,并且一列包括该行所指的年份)和一系列其他特征。此外,我添加了一个字段,显示该员工在该期间代表的 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
}
}
}
}
}
}
主要有两个问题。
Names <- lapply(HR[FactorNames], function(x)sort(unique(x)))
不正确,因为 lapply(HR[FactorNames], function(x)sort(unique(x)))
returns 唯一值作为单个组合元素而不是矢量。这意味着我的 for
循环的内容会抛出错误 Error in Names[1, Year] : incorrect number of dimensions
.
- 我的同心
for
循环根本不可能成为填充阵列的最佳方式,我想知道是否有人知道这是什么。
你会推荐什么?
我编了一些数据
# 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
的公式,每个暗淡的 ~
。
# 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)
这是两个合二为一的问题;如果我应该拆分它们,请告诉我。
我有一份 HR 数据电子表格,我打算将它分成不同的横截面。目前每一行代表一名员工、该特定报告的年份(例如,在三年期间,一名员工会出现三次,并且一列包括该行所指的年份)和一系列其他特征。此外,我添加了一个字段,显示该员工在该期间代表的 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
}
}
}
}
}
}
主要有两个问题。
Names <- lapply(HR[FactorNames], function(x)sort(unique(x)))
不正确,因为lapply(HR[FactorNames], function(x)sort(unique(x)))
returns 唯一值作为单个组合元素而不是矢量。这意味着我的for
循环的内容会抛出错误Error in Names[1, Year] : incorrect number of dimensions
.- 我的同心
for
循环根本不可能成为填充阵列的最佳方式,我想知道是否有人知道这是什么。
你会推荐什么?
我编了一些数据
# 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
的公式,每个暗淡的 ~
。
# 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)