将 sas if-else 语句转换为 R
convert sas if-else statement to R
我有一个类似于以下逻辑的 SAS 代码。我想使用 if-else 或 ifelse 方法将它转换为 R 脚本。
这是 SAS 代码示例:
if cat1=1 then do;
if cat2 eq 'U' then do;
if var1 =. then var1 = var3;
end;
else if cat2='A' then do;
if var1 =. then var1=var2;
end;
end;
else do;
if cat2 eq 'U' then do;
if cat3 = 'NC' then do;
if var1 =. then do;
if var2 ge 4.0 then var1 =1.15;
else if var2 le 4.0 then var1 = 10.0;
else var1 = 6.1;
end;
end;
end;
end;
这里是转换后的R脚本代码。但是,最后一步 (df4) 会覆盖之前的所有步骤。有没有更好的方法将此逻辑转换为 R if - else 语句。
df <- data.frame(cat1 = c(rep(1,3), rep(0,4)),
cat2 = c(rep('U',2), rep('A',3), 'U', 'U'),
cat3 = c(rep('NC',2), rep('RF',2), 'NC', 'NC', 'NC'),
var1 = c(rep(NA,5),.14, NA),
var2 = c(rep(NA,2), 4.5, 2.3, 8.5, 3.4, 2.4),
var3 = c(rep(2.6, 2), 3.9, NA, 4.2, .012, NA))
df2 <- transform(df,
var1 = ifelse(is.na(var1) & cat1 ==1 & cat2 == 'U', var3, var1)
)
df3 <- transform(df2,
var1 = ifelse(is.na(var1) & cat1 ==1 & cat2 == 'A', var2, var1)
)
df4 <- transform(df3,
var1 = ifelse(is.na(var1) & cat2 == 'U' & cat3 == 'NC' & var2 >= 4.0, 1.15,
ifelse(var2 <= 4.0, 10.0, 6.1))
)
请帮忙?
我通常会尝试 "targeted assignments",即仅分配到符合当前条件的位置。这样我就可以避免在使用嵌套的 ifelse
修改整个向量时出现覆盖问题,而我还没有充分调试:
df$var1[ with(df, is.na(var1) & cat1 ==1 & cat2 == 'U' )] <- df$var3
df$var1[ with(df,(is.na(var1) & cat1 ==1 & cat2 == 'A') ] <- df$var2
df$var1[ with(df, is.na(var1) & cat2 == 'U' & cat3 == 'NC') ] <-
with( df[ with(df, is.na(var1) & cat2 == 'U' & cat3 == 'NC') , ],
ifelse( var2 >= 4.0, 1.15,
ifelse(var2 <= 4.0, 10.0, 6.1))
)
我不确定我的逻辑是否正确。我刚刚将你的 R 条件复制到选择中。
df
cat1 cat2 cat3 var1 var2 var3
1 1 U NC 2.60 NA 2.600
2 1 U NC 2.60 NA 2.600
3 1 A RF NA 4.5 3.900
4 0 A RF NA 2.3 NA
5 0 A NC NA 8.5 4.200
6 0 U NC 0.14 3.4 0.012
7 0 U NC 10.00 2.4 NA
我有一个类似于以下逻辑的 SAS 代码。我想使用 if-else 或 ifelse 方法将它转换为 R 脚本。 这是 SAS 代码示例:
if cat1=1 then do;
if cat2 eq 'U' then do;
if var1 =. then var1 = var3;
end;
else if cat2='A' then do;
if var1 =. then var1=var2;
end;
end;
else do;
if cat2 eq 'U' then do;
if cat3 = 'NC' then do;
if var1 =. then do;
if var2 ge 4.0 then var1 =1.15;
else if var2 le 4.0 then var1 = 10.0;
else var1 = 6.1;
end;
end;
end;
end;
这里是转换后的R脚本代码。但是,最后一步 (df4) 会覆盖之前的所有步骤。有没有更好的方法将此逻辑转换为 R if - else 语句。
df <- data.frame(cat1 = c(rep(1,3), rep(0,4)),
cat2 = c(rep('U',2), rep('A',3), 'U', 'U'),
cat3 = c(rep('NC',2), rep('RF',2), 'NC', 'NC', 'NC'),
var1 = c(rep(NA,5),.14, NA),
var2 = c(rep(NA,2), 4.5, 2.3, 8.5, 3.4, 2.4),
var3 = c(rep(2.6, 2), 3.9, NA, 4.2, .012, NA))
df2 <- transform(df,
var1 = ifelse(is.na(var1) & cat1 ==1 & cat2 == 'U', var3, var1)
)
df3 <- transform(df2,
var1 = ifelse(is.na(var1) & cat1 ==1 & cat2 == 'A', var2, var1)
)
df4 <- transform(df3,
var1 = ifelse(is.na(var1) & cat2 == 'U' & cat3 == 'NC' & var2 >= 4.0, 1.15,
ifelse(var2 <= 4.0, 10.0, 6.1))
)
请帮忙?
我通常会尝试 "targeted assignments",即仅分配到符合当前条件的位置。这样我就可以避免在使用嵌套的 ifelse
修改整个向量时出现覆盖问题,而我还没有充分调试:
df$var1[ with(df, is.na(var1) & cat1 ==1 & cat2 == 'U' )] <- df$var3
df$var1[ with(df,(is.na(var1) & cat1 ==1 & cat2 == 'A') ] <- df$var2
df$var1[ with(df, is.na(var1) & cat2 == 'U' & cat3 == 'NC') ] <-
with( df[ with(df, is.na(var1) & cat2 == 'U' & cat3 == 'NC') , ],
ifelse( var2 >= 4.0, 1.15,
ifelse(var2 <= 4.0, 10.0, 6.1))
)
我不确定我的逻辑是否正确。我刚刚将你的 R 条件复制到选择中。
df
cat1 cat2 cat3 var1 var2 var3
1 1 U NC 2.60 NA 2.600
2 1 U NC 2.60 NA 2.600
3 1 A RF NA 4.5 3.900
4 0 A RF NA 2.3 NA
5 0 A NC NA 8.5 4.200
6 0 U NC 0.14 3.4 0.012
7 0 U NC 10.00 2.4 NA