我想用这个 SAS 循环代码制作 R 代码
I want to make R codes with this SAS loop codes
我在做大数据分析,想把每个人的体力加起来activity。
pha_04z1
是上周剧烈运动的天数activity,pha_05z1
和pha_06z1
是小时和分钟。 pha_07z1
是一周中等体力activity的天数,pha_08z1
和pha_09z1
是小时和分钟。虽然它不在原始数据中,但我正在尝试创建名为 ph_a0100
、ph_0200
、ph_0300
、ph_0400
、ph_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)
此代码无效。我该如何解决这个问题?
先感谢您。请帮忙。
缺少数据,我会抛出一些代码,也许它会起作用。
意识到在 SAS 中,您可以使用 if
语句进行条件重新分配,在 R 中,<-
运算符会覆盖所有内容,除非 LHS 是索引引用(使用 [
或 $
)。 (我不太了解 SAS,所以我在解释您的代码时可能会弄错。)
不要在 if
语句中使用单 &
除非它被包装在逻辑聚合器中,例如 any
、all
、等等。虽然它目前有效,但 R 的 if
运算符的前提是它的条件必须恰好为 1,其他任何东西都是错误的(并且,在 R-4.2.0 中,将导致错误,而不仅仅是一个警告)。
我 推断 你对 pha_06z1
等的引用实际上是 ch2020_
中的列。由于缺乏数据,因此很难确定这一点。
三种方式:
嵌套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)))
嵌套 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)))
)
分配默认值,然后迭代替换 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
我在做大数据分析,想把每个人的体力加起来activity。
pha_04z1
是上周剧烈运动的天数activity,pha_05z1
和pha_06z1
是小时和分钟。 pha_07z1
是一周中等体力activity的天数,pha_08z1
和pha_09z1
是小时和分钟。虽然它不在原始数据中,但我正在尝试创建名为 ph_a0100
、ph_0200
、ph_0300
、ph_0400
、ph_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)
此代码无效。我该如何解决这个问题? 先感谢您。请帮忙。
缺少数据,我会抛出一些代码,也许它会起作用。
意识到在 SAS 中,您可以使用
if
语句进行条件重新分配,在 R 中,<-
运算符会覆盖所有内容,除非 LHS 是索引引用(使用[
或$
)。 (我不太了解 SAS,所以我在解释您的代码时可能会弄错。)不要在
if
语句中使用单&
除非它被包装在逻辑聚合器中,例如any
、all
、等等。虽然它目前有效,但 R 的if
运算符的前提是它的条件必须恰好为 1,其他任何东西都是错误的(并且,在 R-4.2.0 中,将导致错误,而不仅仅是一个警告)。我 推断 你对
pha_06z1
等的引用实际上是ch2020_
中的列。由于缺乏数据,因此很难确定这一点。
三种方式:
嵌套
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)))
嵌套
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))) )
分配默认值,然后迭代替换 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