【问题标题】:Consecutive Sum of column x that relates to column y与列 y 相关的列 x 的连续总和
【发布时间】:2021-06-04 12:45:37
【问题描述】:

在我的数据集中,每一天的成交量计数总是从 1 开始。像这样:

Particle_Size Titrant      Day    Volume_titrant   
    <chr>         <chr>   <dbl>          <dbl>     
  1 > 40          NaOH        0              1     
  2 > 40          NaOH        0              2     
  3 > 40          NaOH        0              3     
  4 > 40          NaOH        0              4     
  5 > 40          NaOH        0              5     
 39 > 40          NaOH        8              1    
 40 > 40          NaOH        8              2     
 41 > 40          NaOH        8              3     

105 <60           NaOH        0              1     
106 <60           NaOH        0              2     
107 <60           NaOH        0              3     
131 <60           NaOH        5              2     
132 <60           NaOH        5              4    

我想要的是一个额外的列,用于计算每个 Particle_Size 在所有日子里的总成交量。像这样:

Particle_Size Titrant       Day     Volume_titrant  Volume_total
    <chr>         <chr>   <dbl>          <dbl>      <dbl>
  1 > 40          NaOH        0              1     1
  2 > 40          NaOH        0              2     2
  3 > 40          NaOH        0              3     3
  4 > 40          NaOH        0              4     4
  5 > 40          NaOH        0              5     5
 39 > 40          NaOH        8              1     6
 40 > 40          NaOH        8              2     7
 41 > 40          NaOH        8              3     8

105 <60           NaOH        0              1     1
106 <60           NaOH        0              2     2
107 <60           NaOH        0              3     3
131 <60           NaOH        5              2     5
132 <60           NaOH        5              4     9

我尝试对我的数据集进行分组,然后使用cumsum() 改变一个新列。 这将几天的体积加在一起,并且每个新的 Particle_Size 都从 1 开始。到目前为止一切都很好,但我在示例中看到这并没有按照我的意愿计算音量。

df = na.omit()%>%
     group_by(Particle_Size, Titrant)%>%
     mutate(Total_Volume = cumsum(Volume_titrant))
Particle_Size Titrant       Day     Volume_titrant   Cumsum
    <chr>         <chr>   <dbl>          <dbl>      <dbl>
  1 > 40          NaOH        0              1     1
  2 > 40          NaOH        0              2     3
  3 > 40          NaOH        0              3     6
  4 > 40          NaOH        0              4     10
  5 > 40          NaOH        0              5     15
 39 > 40          NaOH        8              1     16
 40 > 40          NaOH        8              2     18
 41 > 40          NaOH        8              3     21

105 <60           NaOH        0              1     1
106 <60           NaOH        0              2     3
107 <60           NaOH        0              3     6
131 <60           NaOH        5              2     8
132 <60           NaOH        5              4     12

还尝试使用 rollsum() 而不是 cumsum(),但我遇到了 k 参数的问题。使用k = 1,它只复制卷列,使用任何其他k,我收到如下错误代码:

Error: Problem with `mutate()` input `Total_Volume`.
x Input `Total_Volume` can't be recycled to size 48.
i Input `Total_Volume` is `rollsum(Volume_titrant, k = 2)`.
i Input `Total_Volume` must be size 48 or 1, not 47.
i The error occurred in group 1: Particle_Size = "<60", Titrant = "NaOH".

那里有一个功能还是我需要一个带循环的解决方案? 有什么想法吗?

enter code here

【问题讨论】:

  • (1) group_by(Particle_Size, Titrant) 很好,但您没有提供任何数据。在此之前您是否省略了领先的mydata %&gt;%?还是您打算使用group_by(mydata, Particle_Size, Titrant)? (2) 如果您不想要累积和,也许您应该使用summarize(Total_Volume = sum(Volume_titrant) 而不是mutate? (3) 如果您收到警告/错误,请包括它们(否则我们帮不上什么忙)。它还有助于提供您的预期输出(如果不是所有显示的数据,至少有几行)。最后,请使用dput提供样本数据。谢谢!
  • 谢谢,为了让问题更易于理解,我忘记了一些细节。 summarize(Total_Volume = sum(Volume_titrant) 的问题在于它给了我每个类别的总和,但它没有给我新列中正在进行的卷数。希望这是有道理的。
  • 形成一个可重复的问题可能很困难,但是当您在一个新的空会话中尝试您的问题时,它会有所帮助。例如df = na.omit() %&gt;% ... errs 和argument "object" is missing, with no default,因为你还没有在你的数据管道中包含框架名称,与我的第一条评论相比没​​有有效的变化。我不认为那是您的真实代码;虽然我非常感谢为了在 Stack 上重现问题而简化代码,但 代码必须在其简化状态下仍然可以工作
  • 再次,提供更好的数据,粘贴来自dput(x) 的输出,其中x 是您数据的代表性样本。它可能是dput(head(df,20)),也可能是框架中的一小部分行。关键是它的变化足以显示关键差异,并且足够连续以展示所需的效果。
  • 为什么第 132 行所需的输出是 9?而第 40 行和第 41 行中的所需输出分别是 7 和 8。第 132 行应该是 7 还是第 40 行和第 41 行应该分别是 8 和 11?你的逻辑有点混乱!您只想将前一天的最后一个值添加到当天吗?

标签: r dplyr


【解决方案1】:

正如我已经说过的,您想要的输出中似乎有一些错字。 为什么第 132 行所需的输出是 9?而第 40 行和第 41 行中的所需输出分别是 7 和 8。第 132 行应该是 7 还是第 40 行和第 41 行应该分别是 8 和 11?你的逻辑有点混乱!您只想将前一天的最后一个值添加到当天吗?试试这个语法

library(dplyr)

df %>% left_join(df %>% group_by(Particle_Size, Day) %>%
                   summarise(last_val = last(Volume_titrant), .groups = 'drop') %>%
                   group_by(Particle_Size) %>%
                   mutate(last_val = cumsum(lag(last_val, default = 0))), by = c('Particle_Size', 'Day')) %>%
  mutate(desired_value = Volume_titrant + last_val)

#>    Particle_Size Titrant Day Volume_titrant last_val desired_value
#> 1            >40    NaOH   0              1        0             1
#> 2            >40    NaOH   0              2        0             2
#> 3            >40    NaOH   0              3        0             3
#> 4            >40    NaOH   0              4        0             4
#> 5            >40    NaOH   0              5        0             5
#> 6            >40    NaOH   8              1        5             6
#> 7            >40    NaOH   8              2        5             7
#> 8            >40    NaOH   8              3        5             8
#> 9            <60    NaOH   0              1        0             1
#> 10           <60    NaOH   0              2        0             2
#> 11           <60    NaOH   0              3        0             3
#> 12           <60    NaOH   5              2        3             5
#> 13           <60    NaOH   5              4        3             7

reprex package (v2.0.0) 于 2021-06-04 创建

【讨论】:

    【解决方案2】:

    您可以尝试在mutate() 通话中使用sum() 吗?

    library(dplyr)
    
    dat %>%
      group_by(Particle_Size) %>%
      mutate(Total_valume = sum(Volume_titrant)) %>% 
      ungroup()
    
    # # A tibble: 13 x 5
    #    Particle_Size Titrant   Day Volume_titrant Total_valume
    #            <int> <chr>   <int>          <int>        <int>
    #  1            40 NaOH        0              1           21
    #  2            40 NaOH        0              2           21
    #  3            40 NaOH        0              3           21
    #  4            40 NaOH        0              4           21
    #  5            40 NaOH        0              5           21
    #  6            40 NaOH        8              1           21
    #  7            40 NaOH        8              2           21
    #  8            40 NaOH        8              3           21
    #  9            60 NaOH        0              1           12
    # 10            60 NaOH        0              2           12
    # 11            60 NaOH        0              3           12
    # 12            60 NaOH        5              2           12
    # 13            60 NaOH        5              4           12
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多