我想用这个 SAS 循环代码制作 R 代码

I want to make R codes with this SAS loop codes

我在做大数据分析,想把每个人的体力加起来activity。 pha_04z1是上周剧烈运动的天数activity,pha_05z1pha_06z1是小时和分钟。 pha_07z1是一周中等体力activity的天数,pha_08z1pha_09z1是小时和分钟。虽然它不在原始数据中,但我正在尝试创建名为 ph_a0100ph_0200ph_0300ph_0400ph_0500 的变量以获得最终物理activity 金额。 中度或更多体力 activity 定义为 'in the past week, 20 minutes or more per day and 3 days a week or more' 已定义。 SAS 代码如下。

if 0<=pha_05z1 <=24 and pha_06z1=. then do;
 ph_a0100=pha_05z1*60;
end;
if a<=pha_05z1<=24 and 0<=pha_06z1 <=59 then do;
 ph_a0100=(pha_05z1*60)+pha_06z1;
end;
if pha_05z1=. and 0<=pha_06z1<=59 then do;
 ph_a0100=pha_06z1;
end;
if pha_04z1 in (0:2) the ph_a0200=0;
else if pha_04z1 in (3:7) then do;
 if ph_a0100=. then ph_a0200=.;
 else if 0<=ph_a0100<=19 then ph_a0200=0;
 else if 20<=ph_a0100 then ph_a0200=1;
end;
-----
(Abstinence from vigorous physical activity)
-----
if ph_a0200=1 or ph_a0400=1 then ph_a0500=1;
else if ph_a0200=0 and ph_a0400=0 then ph_a0500=0;

下面是我用R代码做的。

if (pha_05z1<=24 & pha_05z1>=0 & pha_06z1==88)
{
  ch2020_$ph_a0100 <- pha_05z1*60
}
if (pha_05z1<=24 & pha_05z1>=0 & pha_06z1<=59 & pha_06z1>=0)
{
  ch2020_$ph_a0100 <- pha_05z1*60 + pha_06z1
}
if (pha_05z1==88 & pha_06z1<=59 & pha_06z1>=0)
{
  ch2020_$ph_a0100 <- pha_06z1
}
ch2020_$ph_a0200 <- 
  ifelse(pha_04z1%in%c(0,1,2),0, 
         ifelse(pha_04z1>=3 & ch2020_$ph_a0100==NA),NA, 
         ifelse(ch2020_$ph_a0100<=19 & ch2020_$ph_a0100 >=0),0,1)

此代码无效。我该如何解决这个问题? 先感谢您。请帮忙。

缺少数据,我会抛出一些代码,也许它会起作用。

  1. 意识到在 SAS 中,您可以使用 if 语句进行条件重新分配,在 R 中,<- 运算符会覆盖所有内容,除非 LHS 是索引引用(使用 [$)。 (我不太了解 SAS,所以我在解释您的代码时可能会弄错。)

  2. 不要在 if 语句中使用单 & 除非它被包装在逻辑聚合器中,例如 anyall、等等。虽然它目前有效,但 R 的 if 运算符的前提是它的条件必须恰好为 1,其他任何东西都是错误的(并且,在 R-4.2.0 中,将导致错误,而不仅仅是一个警告)。

  3. 推断 你对 pha_06z1 等的引用实际上是 ch2020_ 中的列。由于缺乏数据,因此很难确定这一点。

三种方式:

  1. 嵌套ifelse:

     ch2020_$ph_a0100 <- ifelse(ch2020_$pha_05z1<=24 & ch2020_$pha_05z1>=0 & ch2020_$pha_06z1==88, 
                                ch2020_$pha_05z1*60,
                                ifelse(ch2020_$pha_05z1<=24 & ch2020_$pha_05z1>=0 & ch2020_$pha_06z1<=59 & ch2020_$pha_06z1>=0,
                                       ch2020_$pha_05z1*60 + ch2020_$pha_06z1,
                                       ifelse(ch2020_$pha_05z1==88 & ch2020_$pha_06z1<=59 & ch2020_$pha_06z1>=0,
                                              ch2020_$pha_06z1, ch2020_$ph_a0100)))
    
  2. 嵌套 ifelse,但将其包装在 with 中以使其更具可读性:

    ch2020_$ph_a0100 <- with(ch2020_,
      ifelse(pha_05z1<=24 & pha_05z1>=0 & pha_06z1==88, 
             pha_05z1*60,
             ifelse(pha_05z1<=24 & pha_05z1>=0 & pha_06z1<=59 & pha_06z1>=0,
                    pha_05z1*60 + pha_06z1,
                    ifelse(pha_05z1==88 & pha_06z1<=59 & pha_06z1>=0,
                           pha_06z1, ph_a0100)))
    )
    
  3. 分配默认值,然后迭代替换 sub-indexed 部分。

    # ch2020_$ph_a0100 is predefined with some value or just NA
    ind <- with(ch2020_, pha_05z1<=24 & pha_05z1>=0 & pha_06z1==88)
    ch2020_$ph_a0100[ind] <- ch2020_$pha_05z1[ind] * 60
    ind <- with(ch2020_, pha_05z1<=24 & pha_05z1>=0 & pha_06z1<=59 & pha_06z1>=0)
    ch2020_$ph_a0100[ind] <- with(ch2020_, pha_05z1[ind]*60 + pha_06z1[ind])
    ind <- with(ch2020_, pha_05z1==88 & pha_06z1<=59 & pha_06z1>=0)
    ch2020_$ph_a0100[ind] <- ch2020_$pha_06z1