我试图将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;对于这种情况。
感谢您的帮助。
亲切的问候,
荣高。
答案 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