首页 > 解决方案 > 如何使用 dplyr 将列中的值除以 R 中的特定行?

问题描述

所以我目前正在尝试创建一个按小时生成的新列 cookie,但是我收到关于“按小时生成的 cookie”的大小必须为 1,而不是 0 的错误,而关于“按小时生成的 cookie”的某些内容不能被回收到大小 1。但是,我确实得到了一个新列,但计算有点偏离。

样本数据:

working day working week    franchise_id    measurement     amount

01-01-2020  01-01-2020      1               Cookies made    100 
01-01-2020  01-01-2020      1               Hours           1
...
03-12-2020  03-11-2020      1               Cookies made    200 
03-13-2020  03-11-2020      1               Hours           5

代码:

cookie_data %>% group_by(franchise_id) %>% mutate(cookiesperhour = amount/amount[measurement=="Hours"]) %>% ungroup()

任何帮助是极大的赞赏。

标签: rdplyrtidyverse

解决方案


pivot_wider我认为这是用于重新定向数据的理想设置:

library(tidyverse)

df %>% 
  tidyr::pivot_wider(id_cols = c(`working week`, franchise_id),
                     names_from = measurement,
                     values_from = amount) %>%
  dplyr::mutate(cookiesperhour = `Cookies made`/Hours)

输出

  `working week` franchise_id `Cookies made` Hours cookiesperhour
  <chr>                 <dbl>          <dbl> <dbl>          <dbl>
1 01-01-2020                1            100     1            100
2 03-11-2020                1            200     5             40

如果您需要维护该结构,那么您可以执行以下操作,只要:

  1. 该结构使得每个只有两个测量值,franchise_id并且work week
  2. 第一次测量是“制作的饼干”,每组的第二次(或最后一次)测量是“小时”。为了安全起见,您可以预先排序以确保是这种情况,但鉴于所有这些警告,您可以看到为什么这可能不是最好的方法。
df %>% 
  dplyr::group_by(franchise_id, `working week`) %>% 
  dplyr::mutate(cookiesperhour = first(amount) / last(amount)) %>% 
  dplyr::ungroup()

输出

  `working day` `working week` franchise_id measurement  amount cookiesperhour
  <chr>         <chr>                 <dbl> <chr>         <dbl>          <dbl>
1 01-01-2020    01-01-2020                1 Cookies made    100            100
2 01-01-2020    01-01-2020                1 Hours             1            100
3 03-12-2020    03-11-2020                1 Cookies made    200             40
4 03-13-2020    03-11-2020                1 Hours             5             40

数据

df <- structure(list(`working day` = c("01-01-2020", "01-01-2020", 
"03-12-2020", "03-13-2020"), `working week` = c("01-01-2020", 
"01-01-2020", "03-11-2020", "03-11-2020"), franchise_id = c(1, 
1, 1, 1), measurement = c("Cookies made", "Hours", "Cookies made", 
"Hours"), amount = c(100, 1, 200, 5)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))

推荐阅读