R:使用同一列中的值之间的差值创建新列,其中一个值与条件匹配

R:使用同一列中的值之间的差值创建新列,其中一个值与条件匹配,r,dplyr,powerbi,R,Dplyr,Powerbi,我有一个包含列的数据帧:Slot、Period、SortNumber和Value。 实际上,这个数据框是从一些access数据库读取数据创建的,我对它做了一些工作,比较字符串,等等。。。因此,我也使用RODBC和stringr包。这部分代码在R和Power BI中完美地工作,因此,我没有在这里复制。 这是我的最终数据帧的一个示例: dfAccess <- data.frame(Slot = c("X1", "X2", "X3", "X1", "X3","X1", "X2", "X3", "

我有一个包含列的数据帧:Slot、Period、SortNumber和Value。 实际上,这个数据框是从一些access数据库读取数据创建的,我对它做了一些工作,比较字符串,等等。。。因此,我也使用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))
我想创建一个新的列DiffValue,该列计算值和值之间的差异,其中SortNumer=1按插槽和时段分组

问题是插槽和周期不一定对每个SortNumber都具有相同的值。在这种情况下,我希望使用0作为默认值,并计算每行的差异

我使用的是dplyr,当数据一致时,工作正常。否则,我会得到错误:列DiffValue的长度必须是组大小的1,而不是0

这是一种方法吗

编辑:我修改了原始帖子的部分内容,因为Sinh Nguyen发现了数据中的一个问题,但我仍然无法计算差异


谢谢

不确定我是否理解正确,但作为练习,我将您的数据帧转换为更宽的格式,以便更容易查看:

df% filterSortNumber==1%>% 完全联接 dfAccess%>% filterSortNumber==2, by=cSlot,句号 %>% 变异_atvarsValue.x,Value.y,替换_na,0%>%用零填充缺失值 行%>% 变异 DiffValue=Value.y-Value.x df包含:

# A tibble: 6 x 7
  Slot  Period SortNumber.x Value.x SortNumber.y Value.y DiffValue
  <fct>  <dbl>        <dbl>   <dbl>        <dbl>   <dbl>     <dbl>
1 X1         1            1       9            2       6        -3
2 X2         1            1       5            2       4        -1
3 X3         1            1       7            2       8         1
4 X1         2            1       9           NA       0        -9
5 X3         2            1       5            2       1        -4
6 X2         2           NA       0            2       2         2
# A tibble: 12 x 5
   Slot  Period SortNumber Value DiffValue
   <fct>  <dbl>      <dbl> <dbl>     <dbl>
 1 X1         1          1     9         0
 2 X2         1          1     5         0
 3 X3         1          1     7         0
 4 X1         2          1     9         0
 5 X3         2          1     5         0
 6 X2         2         NA     0         0
 7 X1         1          2     6        -3
 8 X2         1          2     4        -1
 9 X3         1          2     8         1
10 X1         2         NA     0        -9
11 X3         2          2     1        -4
12 X2         2          2     2         2
df2包含:

# A tibble: 6 x 7
  Slot  Period SortNumber.x Value.x SortNumber.y Value.y DiffValue
  <fct>  <dbl>        <dbl>   <dbl>        <dbl>   <dbl>     <dbl>
1 X1         1            1       9            2       6        -3
2 X2         1            1       5            2       4        -1
3 X3         1            1       7            2       8         1
4 X1         2            1       9           NA       0        -9
5 X3         2            1       5            2       1        -4
6 X2         2           NA       0            2       2         2
# A tibble: 12 x 5
   Slot  Period SortNumber Value DiffValue
   <fct>  <dbl>      <dbl> <dbl>     <dbl>
 1 X1         1          1     9         0
 2 X2         1          1     5         0
 3 X3         1          1     7         0
 4 X1         2          1     9         0
 5 X3         2          1     5         0
 6 X2         2         NA     0         0
 7 X1         1          2     6        -3
 8 X2         1          2     4        -1
 9 X3         1          2     8         1
10 X1         2         NA     0        -9
11 X3         2          2     1        -4
12 X2         2          2     2         2

HTH或至少为您提供了解决此问题的方法和想法

仍然不能完全确定数据集的性质以及您想要实现的目标。但这将解决错误,对于没有SortNumber==1的Slot+Period对,它将自动使用0Zero作为默认值

# Sample data set with one pair of Slot+Period that doesn't have any SortNumber==1
dfAccess <- data.frame(Slot = c("X1", "X2", "X3", "X1", "X2", "X3","X1", "X2", "X3","X1", "X2", "X3"), 
           Period = c(1,1,1,2,2,2,1,1,1,2,2,2), 
           SortNumber = c(1, 1, 2, 1,1,1,2,2,2,2,2,2), 
           Value = c(9,5,7,9,1,5,6,4,8,10,2,1))

# Your command will generate an error
dfAccess <-dfAccess %>%
      group_by(Slot, Period) %>%
      mutate(DiffValue = Value - Value[SortNumber == 1] )
# ​Error: Column `DiffValue` must be length 2 (the group size) or one, not 0

# This command will only take 1st value of SortNumber==1 in any pair Slot+Number
dfAccess %>%
    group_by(Slot, Period) %>%
    mutate(DiffValue = Value - first(Value[SortNumber==1], default=0)) %>%
    ungroup()

我认为错误在于你的实际数据。至少有一对插槽+周期没有任何SortNumber==1。从错误输出中,我猜这对只有一条SortNumber记录=1@SinhNguyen,你完全正确。SortNumber 1比SortNumber 2多一行。我为我的过错道歉。然而,它带来了一种我没有预料到的情况。。。。如果插槽和时段的值不相同。是否有方法计算缺失行的差值(假设值为0)?
# A tibble: 12 x 5
   Slot  Period SortNumber Value DiffValue
   <fct>  <dbl>      <dbl> <dbl>     <dbl>
 1 X1         1          1     9         0
 2 X2         1          1     5         0
 3 X3         1          1     7         0
 4 X1         2          1     9         0
 5 X3         2          1     5         0
 6 X2         2         NA     0         0
 7 X1         1          2     6        -3
 8 X2         1          2     4        -1
 9 X3         1          2     8         1
10 X1         2         NA    NA        NA
11 X3         2          2     1        -4
12 X2         2          2     2         2
# Sample data set with one pair of Slot+Period that doesn't have any SortNumber==1
dfAccess <- data.frame(Slot = c("X1", "X2", "X3", "X1", "X2", "X3","X1", "X2", "X3","X1", "X2", "X3"), 
           Period = c(1,1,1,2,2,2,1,1,1,2,2,2), 
           SortNumber = c(1, 1, 2, 1,1,1,2,2,2,2,2,2), 
           Value = c(9,5,7,9,1,5,6,4,8,10,2,1))

# Your command will generate an error
dfAccess <-dfAccess %>%
      group_by(Slot, Period) %>%
      mutate(DiffValue = Value - Value[SortNumber == 1] )
# ​Error: Column `DiffValue` must be length 2 (the group size) or one, not 0

# This command will only take 1st value of SortNumber==1 in any pair Slot+Number
dfAccess %>%
    group_by(Slot, Period) %>%
    mutate(DiffValue = Value - first(Value[SortNumber==1], default=0)) %>%
    ungroup()