如何修复重复措施的第一行

时间:2018-01-04 20:22:06

标签: r

我试图将SAS代码翻译成R但我不知道如何翻译以下SAS代码:

data df; by id area;
if first.area and area = 'A' then do;
var1_sum = 0;
var2_sum = 0;
end;
if indicator = 'A' then do;
var1_sum + var1;
var2_sum + var2;
end;

来自之前的数据集:

id  area    var1    var2
1   A   9   9
1   A   4   8
1   A   5   2
1   B   1   4
1   B   8   5
1   B   0   6
1   C   3   7
1   C   2   8

当使用上面的SAS代码时,我们得到以下结果:

id  area    var1    var2    var1_sum    var2_sum
1   A   9   9   9   9
1   A   4   8   13  17
1   A   5   2   18  19
1   B   1   4   1   4
1   B   8   5   9   9
1   B   0   6   9   15
1   C   3   7   3   7
1   C   2   8   5   15

我正在使用dplyr在R中编码。所以,我已经开始了#34;一部分"我试图翻译的R代码,但我不知道如何编码"如果条件"在SAS中说明:

df <- df %>%
  group_by(id, area) %>%
  .....

我正在寻求帮助如何包含&#34; if条件&#34;对于这种情况。

感谢您的帮助。

亲切的问候,

荣高。

2 个答案:

答案 0 :(得分:1)

您可以在基座R中使用ave

执行此操作
## Your data
df = read.table(text="id  area    var1    var2
1   A   9   9
1   A   4   8
1   A   5   2
1   B   1   4
1   B   8   5
1   B   0   6
1   C   3   7
1   C   2   8",
header=TRUE)

df$var1_sum = ave(df$var1, df$id, df$area, FUN=cumsum)
df$var2_sum = ave(df$var2, df$id, df$area, FUN=cumsum)

df
  id area var1 var2 var1_sum var2_sum
1  1    A    9    9        9        9
2  1    A    4    8       13       17
3  1    A    5    2       18       19
4  1    B    1    4        1        4
5  1    B    8    5        9        9
6  1    B    0    6        9       15
7  1    C    3    7        3        7
8  1    C    2    8        5       15

答案 1 :(得分:0)

使用tidyverse方法,您可以使用以下代码:

mydf <-  read.table(text="id  area    var1    var2
1   A   9   9
                1   A   4   8
                1   A   5   2
                1   B   1   4
                1   B   8   5
                1   B   0   6
                1   C   3   7
                1   C   2   8",
                header=TRUE)

library(tidyverse)

mydf %>% 
    group_by(id,area) %>% 
    mutate(var1sum=cumsum(var1),
           var2sum=cumsum(var2))

结果是:

     id area    var1  var2 var1sum var2sum
  <int> <fctr> <int> <int>   <int>   <int>
1     1 A          9     9       9       9
2     1 A          4     8      13      17
3     1 A          5     2      18      19
4     1 B          1     4       1       4
5     1 B          8     5       9       9
6     1 B          0     6       9      15
7     1 C          3     7       3       7
8     1 C          2     8       5      15