【发布时间】: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 %>%?还是您打算使用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() %>% ...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?你的逻辑有点混乱!您只想将前一天的最后一个值添加到当天吗?