【问题标题】:R: add another column with the sum of a column, if all other are the sameR:如果所有其他都相同,则添加另一列与一列的总和
【发布时间】:2018-01-03 10:27:46
【问题描述】:

当其他列相同时,我想在 R 中的数据框中添加另一列,其中包含订单数量的总和。

例如,如果这是我的数据框:

orderdate / orderhour / deliverydate / deliveryhour / orders / 新列:总和


星期三 / 12:00 / 星期五 / 17:00 / 5 / 0
星期三 / 12:00 / 星期五 / 17:00 / 2 / 7
星期四 / 13:00 / 星期五 / 17:00 / 3 / 3
星期四/ 13:00 / 星期五/ 19:00 / 1 / 1

最后一列是我要添加的。最后,零的行可以被删除,所以我不再有重复的数据。因此,只有当所有列都匹配(订单除外)时,才应采用订单的总和。在其他情况下,可以保持相同的值。

有人可以帮帮我吗?

提前致谢!

【问题讨论】:

  • 请参阅stackoverflow.com/a/5963610/7654451 以制作可重现的示例。
  • 为什么第一行的总和是 0 而不是 5?如果有多行会发生什么?除了总和的行之外,您是否希望所有行都为 0?你能发布一个特定组有 3 行以上和理想输出的示例吗?
  • Lara,您是否正在关注 cmets 中对@AntoniosK 回答的讨论?

标签: r


【解决方案1】:
# example data
df = read.table(text = "
orderdate/orderhour/deliverydate/deliveryhour/orders
wednesday/12:00/Friday/17:00/5 
wednesday/12:00/Friday/17:00/2 
thursday/13:00/Friday/17:00/3 
thursday/13:00/Friday/19:00/1
", sep="/", header=T, stringsAsFactors=F)

library(dplyr)

df %>%
  group_by(orderdate, orderhour, deliverydate, deliveryhour) %>% # for each combination of those variables
  mutate(sum_orders = ifelse(n() > 1 &                           # if there are multiple rows
                             row_number() == 1,                  # and this is row 1
                             0,                                  # use a zero
                             cumsum(orders))) %>%                # else use the cum sum
  ungroup()                                                      # forget the grouping

# # A tibble: 4 x 6
#   orderdate orderhour deliverydate deliveryhour orders sum_orders
#   <chr>     <chr>     <chr>        <chr>         <dbl>      <dbl>
# 1 wednesday 12:00     Friday       17:00          5.00       0   
# 2 wednesday 12:00     Friday       17:00          2.00       7.00
# 3 thursday  13:00     Friday       17:00          3.00       3.00
# 4 thursday  13:00     Friday       19:00          1.00       1.00

【讨论】:

  • 结果是对的,但它删除了orders列,它应该添加一个新列。
  • @RuiBarradas 我只是在检查! :) 我对组内多行中的零有点困惑。他们只需要第一行的 0 吗? (所以我可以使用cumsum 方法)。或者他们需要除最后一行之外的每一行中的 0,即该组的总和?
  • OP 说“最后,可以删除零的行”,所以我相信它们根本不需要 0。他们应该需要的是消失的那一列,总和之前的最后一列。
  • @RuiBarradas 我同意这一点。我的问题是当特定组有 3 行或更多行时,OP 如何使用 0。在上面的示例中,组有 1 或 2 行。如果 wednesday / 12:00 / Friday / 17:00 组有 3 行 orders 5,1,1 我们希望总和是 0,6,70,0,7
  • 据我了解,它应该是0,6,7,因此就像您之前所说的那样,cumsum 方法将是这样做的方法。但问题不明确。
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 2020-10-04
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多