- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我要解决的大问题。如果我有足够的声誉来奖励我,我会的!
寻求平衡销售代表客户的地域。我把这个过程分解了,我真的不知道如何在每个地区进行。
在此示例中,有 4 个区域的 1000 个帐户,每个区域有 2 个子联盟,然后是帐户的不同所有者 -- 有些帐户是无主的。每个帐户都有一个介于 1,000 和 100,000 之间的随机值。
可重现的例子:
账户列表:
set.seed(1)
Accounts <- paste0("Acc", 1:1000)
Region <- c("NorthEast", "SouthEast", "MidWest", "West")
League <- sample(c("Majors", "Minors"), 1000, replace = TRUE)
AccValue <- sample(1000:100000, 1000, replace = TRUE)
Owner <- sample(c("Chad", NA, "Jimmy", "Adrian", NA, NA, "Steph", "Matt", "Jared", "Eric"), 1000, replace = TRUE)
AccDF <- data.frame(Accounts, Region, League, AccValue, Owner)
AccDF$Accounts <- as.character(AccDF$Accounts)
AccDF$Region <- as.character(AccDF$Region)
AccDF$League <- as.character(AccDF$League)
AccDF$Owner <- as.character(AccDF$Owner)
地区所有权总结:
Summary <- AccDF %>%
group_by(Region, League, Owner) %>%
summarise(Count = n(),
TotalValue = sum(AccValue))
按地区、联赛汇总:
Summary2 <- AccDF %>%
group_by(Region, League) %>%
summarise(Count = n(),
TotalValue = sum(AccValue),
AccountsPerRep = round(Count / 7, 0),
ValuePerRep = TotalValue / 7)
这就是所有的起始数据,我想对 Summary2 表的每个分组进行以下处理。
西部未成年人示例:
西部未成年人帐户总数:120
#break out into owned and unowned
WestMinorsOwned <- AccDF %>%
filter(Region == "West",
League == "Minors",
!is.na(Owner))
WestMinorsUnowned <- AccDF %>%
filter(Region == "West",
League == "Minors",
is.na(Owner))
#unassign accounts until threshold is hit
New.WestMinors <- WestMinorsOwned %>%
mutate(r = runif(n())) %>%
arrange(r) %>%
group_by(Owner) %>%
mutate(NewOwner = replace(Owner, cumsum(AccValue) > 600000 | row_number() > 14, NA)) %>%
ungroup(Owner) %>%
mutate(Owner = NewOwner) %>%
select(-r, -NewOwner)
所有者更新后,我们将各个部分重新绑定(bind)在一起以拥有 WestMinors 帐户库,所有这些都具有更新的所有者,希望是平衡的。
AssignableWestMinors <- bind_rows(filter(AccDF, Region == "West" & League == "Minors" & is.na(Owner)),
filter(New.WestMinors, is.na(Owner))) %>%
arrange(desc(AccValue))
#check work
OwnerSummary <- New.WestMinors %>%
filter(!is.na(Owner)) %>%
group_by(Region, League, Owner) %>%
summarise(Count = n(), TotalValue = sum(AccValue))
没有人拥有超过 14 个或 600,000 个帐户,因此我们可以开始重新分配无主帐户以尝试平衡每个人。下面的 for 循环查看 OwnerSummary 中的每个名称,找出分配给他们的最小 $$ 并分配最有值(value)的帐户,然后遍历每个帐户,试图平衡每个所有者的份额。
#Balance Unassigned
for (i in 1:nrow(AssignableWestMinors)){
idx <- which.min(OwnerSummary$TotalValue)
OwnerSummary$TotalValue[idx] <- OwnerSummary$TotalValue[idx] + AssignableWestMinors$AccValue[i]
OwnerSummary$Count[idx] <- OwnerSummary$Count[idx] + 1
AssignableWestMinors$Owner[i] <- as.character(OwnerSummary$Owner[idx])}
现在我们只需将之前拥有的和新分配的绑定(bind)在一起,我们就完成了平衡的 West Minors 领土。
WestMinors.Final <- bind_rows(filter(New.WestMinors, !is.na(Owner)), AssignableWestMinors)
WM.Summary <- WestMinors.Final %>%
group_by(Region, League, Owner) %>%
summarise(Count = n(),
TotalValue = sum(AccValue))
每个人的账户数量都差不多,总的 $$ 领土都在合理范围内。
现在,我正在尝试为最初的 4 个地区、2 个联赛的每个分组执行此操作。所以这样做 8 次,然后将它们缝合在一起。每个子组都有不同的 $$ 值(value)阈值和帐户数量。我怎样才能将原始帐户基础分成 8 个部分,应用所有这些,然后将它们重新组合在一起?
最佳答案
您应该利用 ?dplyr::do
对 Region-League 的子集执行您想要的拆分-应用-组合操作。首先,功能化您的逻辑,使其可以在数据框 dta
上运行,该数据框表示主数据框 AccDF
的子集版本。
reAssign <- function(dta) {
other_acct <- dta %>%
filter(!is.na(Owner)) %>%
mutate(r = runif(n())) %>%
arrange(r) %>%
group_by(Owner) %>%
mutate(NewOwner = replace(Owner, cumsum(AccValue) > 600000 | row_number() > 14, NA)) %>%
ungroup(Owner) %>%
mutate(Owner = NewOwner) %>%
select(-r, -NewOwner)
assignable_acct <- other_acct %>%
filter(is.na(Owner)) %>%
bind_rows( filter(dta, is.na(Owner)) ) %>%
arrange(desc(AccValue))
acct_summary <- other_acct %>%
filter(!is.na(Owner)) %>%
group_by(Owner) %>%
summarise(Count = n(), TotalValue = sum(AccValue))
# I have a feeling there's a much better way of doing this, but oh well...
for (i in seq(nrow(assignable_acct))) {
idx <- which.min(acct_summary$TotalValue)
acct_summary$TotalValue[idx] <- acct_summary$TotalValue[idx] + assignable_acct$AccValue[i]
acct_summary$Count[idx] <- acct_summary$Count[idx] + 1
assignable_acct$Owner[i] <- as.character(acct_summary$Owner[idx])
}
final <- other_acct %>%
filter(!is.na(Owner)) %>%
bind_rows(assignable_acct)
return(final)
}
然后简单地将它应用到已经按地区、联赛分组的 AccDF。
new_master <- AccDF %>%
group_by(Region, League) %>%
do( reAssign(.) ) %>%
ungroup()
检查以确保它完成了它的工作...
new_master %>%
group_by(Region, League, Owner) %>%
summarise(Count = n(),
TotalValue = sum(AccValue)) %>%
as.data.frame()
关于r - split apply combine w/function 或 purrr package pmap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42094520/
背景 我有一个问题,可能有多种解决方案,但我相信有一个尚未发现的优雅解决方案利用 purrr。 示例代码 我有一个如下的大数据框,为此我在下面提供了一个示例: library(tibble) libr
我正在尝试使用 purrr 的 modify_in 来修改列表的元素。列表示例: tib_list [[1]] #> # A tibble: 5 x 3 #> col_one col_two c
我正在努力了解 purrr,但我正在为一些本应很容易的事情而苦苦挣扎。 假设我有以下男性和女性数据 n 0, "M", "F")), value = rnorm(n) ) 现在,我要计算值列的以下
我想对“ID”以外的所有列应用 Blom 转换。由于它们都是数字,map_if 和 is.numeric 在这里不起作用。 library(rcompanion) data("mtcars") # G
考虑以下数据框列表: library(tidyverse) df1 % set_names(paste0("df", 1:4)) 如果不是这样,我想将 A 和 B 的元素连接到 B 列中。请注意,
我正在尝试使用 purrr对具有相同索引的列表元素求和。这可以使用以下方法在基础 R 中实现: xx % reduce(sum)返回单个值。有谁知道在 purrr 中执行此操作的语法吗? ? 编辑-我
我有类似于df3的数据。要重现数据,请运行以下命令: vec1 % group_by(A) %>% nest() df2 % left_join(df2, by = "A") 我需要使用这样的
我搜索了 ??"~"但这只能指向 rlang::env_bind (大概是 %<~% )和 base::~ .在 RStudio 中,如何找到 Purrr 的 ~的文档?例如,如果我忘记了如何使用 ~
这个问题在这里已经有了答案: Repeat each row of data.frame the number of times specified in a column (9 个回答) 10 个月
我有以下数据框列表,其中包含名为 cyl 的列 # Create 3 dataframes with identical column names mt_list [[1]] #>
我正在查看使用map的example。这里是: mtcars %>% split(.$cyl) %>% # from base R map(~ lm(mpg ~ wt, data = .))
我没有看到任何关于我的问题。我想,当我看到 purrr 很多模型示例时,如何再次使用在数据上创建的模型?一点点代码会告诉你我在追求什么: 这是基本的gapminder许多模型示例。 library(g
这是一个嵌套数据。 df1 % group_by(group) %>% nest() 我需要使用 purrr:map 运行 lm。 map(df2$data, ~lm(A~B, data=.x)) 找
我有一个命名列表,在该列表中我想根据列表的来源名称重命名它们的列。 我的方法的问题似乎是 .x 占位符,我认为它是我唯一的列表名称。但在 rename_with 函数中,.x 似乎是在每个列表数据框中
给定一个 dataframe,比如 iris 默认值,如何配置 purrr::map_dfr() 函数在 的每一行上运行code>dataframe 并执行函数 foo。 这是我的 df 的一行,请注
感谢这个网站,我使用 R purrr 包来聚合基于多列的数据。聚合按我想要的方式工作,但输出却不然。以下是使用 mtcars 数据集的示例。 library(dplyr) library(purrr)
这是一个嵌套数据。 df1 % group_by(group) %>% nest() 我需要使用 purrr:map 运行 lm。 map(df2$data, ~lm(A~B, data=.x)) 找
我有一个命名列表,在该列表中我想根据列表的来源名称重命名它们的列。 我的方法的问题似乎是 .x 占位符,我认为它是我唯一的列表名称。但在 rename_with 函数中,.x 似乎是在每个列表数据框中
给定一个 dataframe,比如 iris 默认值,如何配置 purrr::map_dfr() 函数在 的每一行上运行code>dataframe 并执行函数 foo。 这是我的 df 的一行,请注
也许我遗漏了一些明显的东西,但我试图将 R 中命名列表的命名列表(甚至可能更多嵌套)扁平化为最终一个扁平列表。 purrr和 rlist似乎有工具。我怎样才能实现子列表的名称成为扁平结果列表的名称预加
我是一名优秀的程序员,十分优秀!