【发布时间】:2019-10-11 14:37:31
【问题描述】:
我有一个包含以下列的数据框:Slot、Period、SortNumber 和 Value。 实际上,这个数据框是从一些访问数据库中读取数据而创建的,我在比较字符串等方面做了一些工作......所以,我也使用 RODBC 和 stringr 包。这部分代码在 R 和 Power BI 中完美运行,所以,我没有在这里重现。 这是我的最终数据框的示例:
dfAccess <- data.frame(Slot = c("X1", "X2", "X3", "X1", "X3","X1", "X2", "X3", "X2", "X3"),
Period = c(1,1,1,2,2,1,1,1,2,2),
SortNumber = c(1, 1, 1, 1,1,2,2,2,2,2),
Value = c(9,5,7,9,5,6,4,8,2,1))
此数据帧在 SortNumber 1 中没有时段 2 的 Slot X2,也没有 SortNumber 2 中时段 2 的 Slot X1(它可以错过任何行)。在视觉上,它意味着:
Slot Period SortNumber Value
=======================================
X1 1 1 9
X2 1 1 5
X3 1 1 7
X1 2 1 9
X3 2 1 5
X1 1 2 6
X2 1 2 4
X3 1 2 8
X2 2 2 2
X3 2 2 1
我想创建一个新列 (DiffValue) 来计算 Value 和 Value 之间的差异,其中 SortNumer 为 = 1(按 Slot 和 Period 分组)
问题是 Slot 和 Period 不一定对每个 SortNumber 都具有相同的值。在这种情况下,我想使用 0 作为默认值并计算每一行的差异。
我正在使用dplyr,当数据一致时,工作正常。否则,我会收到错误消息:"Column DiffValue must be length 1 (the group size), not 0"
dfAccess <-dfAccess %>%
group_by(Slot, Period) %>%
mutate(DiffValue = Value - Value[SortNumber == 1] )
使用这些数据,我希望看到的是:
Slot Period SortNumber Value DiffValue
=========================================================
X1 1 1 9 0
X2 1 1 5 0
X3 1 1 7 0
X1 2 1 9 0
X3 2 1 5 0
X1 1 2 6 -3
X2 1 2 4 -1
X3 1 2 8 1
X2 2 2 2 -2 ("0" - 2)
X3 2 2 1 -4
这是一种方法吗?
编辑:我修改了原始帖子的部分内容,因为 Sinh Nguyen 发现了数据中的问题,但我仍然无法计算差异。
谢谢!
【问题讨论】:
-
我认为错误出在您的实际数据中。至少一对
Slot+Period没有任何SortNumber==1。从错误输出中,我猜这对只有一条记录SortNumber!=1 -
@SinhNguyen,你是完全正确的。 SortNumber 1 比 SortNumber 2 多一排。我为我的错道歉。但是,它带来了一个我没想到的条件......如果 Slot 和 Period 没有相同的值。假设缺失行的值为 0,有没有办法计算差异?