R 使用循环或类似函数包装长代码

R 使用循环或类似函数包装长代码,r,dplyr,case-when,R,Dplyr,Case When,我想知道是否有任何方法可以将下面的代码包装起来,使其更短;我正在考虑使用一个循环或类似的函数来实现这一点。此代码使用AgeatDeath和Disability生成一个新变量(cat)。如果AgeatDeath介于75.6和77.1之间,且残疾等于“无智力和发育残疾”,则代码将创建值为75.6-77.1的cat变量 谢谢 纳德 IDD% 变异( cat=情况( 死亡年龄>=75.6& 年龄死亡=74.3& 年龄死亡=72.5& 年龄死亡=66.5& 年龄死亡=64.1& 年龄死亡=62.3& 年龄

我想知道是否有任何方法可以将下面的代码包装起来,使其更短;我正在考虑使用一个循环或类似的函数来实现这一点。此代码使用AgeatDeath和Disability生成一个新变量(cat)。如果AgeatDeath介于75.6和77.1之间,且残疾等于“无智力和发育残疾”,则代码将创建值为75.6-77.1的cat变量 谢谢 纳德

IDD%
变异(
cat=情况(
死亡年龄>=75.6&
年龄死亡<77.1&
残疾=‘无智力和发育残疾’~‘75.6-77.1’,
死亡年龄>=74.3&
年龄死亡<75.6&
残疾=‘无智力和发育残疾’~‘74.3-75.6’,
死亡年龄>=72.5&
年龄死亡<74.3&
残疾=‘无智力和发育残疾’~‘72.5-74.3’,
死亡年龄>=66.5&
年龄死亡<72.5&
残疾=‘无智力和发育残疾’~‘66.6-72.5’,
死亡年龄>=64.1&
年龄死亡<71.9&
残疾==‘智力残疾’~‘64.1-71.9’,
死亡年龄>=62.3&
年龄死亡<64.1&
残疾==“智力残疾”~“62.3-64.1”,
死亡年龄>=59.4&
年龄死亡<62.3&
残疾==“智力残疾”~“59.4-62.3”,
死亡年龄>=50.4&
年龄死亡<59.4&
残疾==“智力残疾”~“50.4-59.4”,
死亡年龄>=56.47&
年龄死亡<59.1&
残疾==‘唐氏综合症’~‘56.47-59’,
死亡年龄>=55.59&
年龄死亡<56.47&
残疾==‘唐氏综合症’~‘55.59-56.47’,
死亡年龄>=54.42&
年龄死亡<55.59&
残疾==‘唐氏综合症’~‘54.42-55.59’,
死亡年龄>=50.92&
年龄死亡<54.42&
残疾==‘唐氏综合症’~‘50.92-54.42’,
死亡年龄>=53.3&
年龄死亡<58.2&
残疾==“脑瘫”~“53.3-58.2”,
死亡年龄>=50.6&
年龄死亡<53.3&
残疾==‘脑瘫’~‘50.6-53.3’,
死亡年龄>=48.9&
年龄死亡<50.6&
残疾==“脑瘫”~“48.9-50.6”,
死亡年龄>=41.38&
年龄死亡<48.9&
残疾==‘脑瘫’~‘41.4-48.9’,
死亡年龄>=44.2&
年龄死亡<51.1&
残疾==“其他罕见发育残疾”~“44.2-51”,
死亡年龄>=41.6&
年龄死亡<44.2&
残疾==‘其他罕见发育残疾’~‘41.6-44.2’,
死亡年龄>=30.6&
年龄死亡<38.4&
残疾==‘其他罕见发育残疾’~‘30.6-38.4’,
死亡年龄>=38.4&
年龄死亡<41.6&
残疾==“其他罕见发育残疾”~“38.4-41.6”
)
)

一些子集和函数
cut()
可以走很长的路。我将演示的内容不涉及dplyr

首先创建一个emtpy新变量。我们将使用代码的其余部分在几行中填充它

IDD$cat <- NA_character
剩下的你可以补上。现在,我们将使用循环按
Disability
的每个值进行子集,使用
cut()
将值拆分为类别并重命名类别

for (d in names(L)) {
   IDD$cat[IDD$Disability == d] <- as.character(
                                      cut(IDD$Ageatdeath, 
                                        breaks = L[[d]], 
                                        labels = paste(L[[d]][-4], L[[d]][-1], sep = "-"),
                                        include.lowest = TRUE,
                                        right = FALSE))
}
用于(名称中的d(L)){

IDD$cat[IDD$Disability==d]无论您采取何种方法,您仍然需要将阈值和条件存储在某个位置。现在这些阈值和条件已写入您的代码中,但可以移动到表中

考虑摆一张桌子

order | min_age | max_age | disability
------+--------+---------+------------
1     |75.6    | 77.1    | 'No Intelectual and Developmental Disabilities'
2     |74.3    | 75.6    | 'No Intelectual and Developmental Disabilities'
etc.
...
然后,您可以使用该表设置条件。遵循问题中的
parse_exprs
方法:

#条件表的加载
#其他设置
#等等。
#确保条件符合首选顺序
twc=表w条件%>%
安排(订单)
#生成条件的文本字符串
条件=粘贴(“年龄死亡>=”,twc$min_年龄,

“&AgeatDeath谢谢。我尝试了下面的代码,但它没有捕获AgeatDeath的一些值,包括72.01表示无智力和发育障碍。中断有什么问题:L
for (d in names(L)) {
   IDD$cat[IDD$Disability == d] <- as.character(
                                      cut(IDD$Ageatdeath, 
                                        breaks = L[[d]], 
                                        labels = paste(L[[d]][-4], L[[d]][-1], sep = "-"),
                                        include.lowest = TRUE,
                                        right = FALSE))
}
order | min_age | max_age | disability
------+--------+---------+------------
1     |75.6    | 77.1    | 'No Intelectual and Developmental Disabilities'
2     |74.3    | 75.6    | 'No Intelectual and Developmental Disabilities'
etc.
...