就是"Mitylira Hopital"和"Mitylira Hospital",和"Military Hopital"其实都可以看成是录入的时候录错了,其实他们都是"Military Hospital",这个时候我们要做的就是重新编码变量,可以用mutate和recode实现我们的需求:
raw%>% mutate(hospital = recode(hospital, # for
reference: OLD = NEW
"Mitylira Hopital" =
"Military Hospital",
"Mitylira Hospital" =
"Military Hospital",
"Military Hopital" =
"Military Hospital",
"Port Hopital" =
"Port Hospital",
"Central Hopital" =
"Central Hospital",
"other" =
"Other",
"St. Marks Maternity Hopital (SMMH)" =
"St. Mark's Maternity Hospital (SMMH)" ))
上面的代码运行完,我们再看相应的错误的录入都正确地归为相应水平了
大家还应该掌握的使用逻辑判断进行变量重新编码的方法,这个时候需要用到replace(),ifelse()andif_else()和case_when(),给大家写一个case_when的例子,这个函数就是在我们需要根据某个变量的值生成新变量的时候使用,比如我们根据age_unit的不同取值,生成新变量age_years,我们就可以用case_when():
raw %>% mutate(age_years = case_when( age_unit ==
"years" ~ age, age_unit ==
"months" ~ age/12, # 年龄单位为月,age_years就等于年龄/12 is.na(age_unit)
~ age, # 年龄单位缺失的话,默认成“年”,age_years就等于age TRUE
~ NA_real_)) #其余所有情况都归为age_years缺失在使用case_when的时候我们可以将想设定的都设定好,余下的情形都可以用关键字TRUE代表,就想上面代码的最后一行那样,对于age_unit这个变量的其余的所有情况我们都认为age_years为缺失。
缺失值转换依然可以在mutate中完成,因为它依然是在变量转化的框架里:
因为我们的hospital这个变量其实是有很多的缺失值的,我们希望将相应的缺失值都替换成missing,我们就可以写出如下代码:
raw %>% mutate(hospital = replace_na(hospital,
"Missing"))
有一种情况需要注意,就是因子变量中有NA,我们如果用replace_na会报错,上面代码中hospital变量是字符型的,所以没有问题。就是对于一个因子来讲,它本身水平就是固定的,有了NA,我们将NA进行替代,比如替代成missing,其实missing它并不是因子原来本身的一个水平,所以会报错,这个时候我们可以用fct_explicit_na()函数。
fct_explicit_na()函数会直接将因子变量中的NA进行相应的替换,替换的值也自动成为该因子的一个水平。
就是说我们有时候想将连续变量转成分类变量分析,这个时候常常会用到的函数有age_categories(),cut(),quantile(),ntile()
看一个age_categories()的例子:
raw%>% mutate( age_cat = age_categories( age_years, breakers = c(0, 5, 10, 15, 20, 30, 40, 50, 60, 70)))上面的代码就将age_years这个连续变量化成了分类变量,分的节点就是breakers参数的向量中,quantile(),ntile()则可以帮助我们快速地划分节点。分类过后就可以用table函数查看每个类别的数量,上面的代码就是将连续变量age_years用breakers参数中的点进行了划分,划分后形成了分类变量,结果如下:

有时候我们对划分的结果会不放心,比如这个类别到底是开区间还是闭区间,当然这些都是有参数可以调的,为了确认我们也可以做交叉表格,我么可以把原来的连续变量和生成的分类变量进行交叉:
table(
"Numeric Values" = raw
$age_years,
"Categories" = raw
$age_cat, useNA =
"always")
通过这么样一个操作我们就可以判断是不是相应的连续变量都被正确地划分到了相应的类别中:

还有一种比较特别的需求,我们虽然想按连续变量分组,但是我想每个组的人数相同,这个时候结合ntile()就可以实现,比如我想把age_years化成分类变量,且规定每一类人数相同,我就可以写出如下代码:
ntile_data
<- raw %>% mutate(even_groups = ntile(age_years, 10))
去重去重大家就去研究一个函数,叫distinct就行。
行的过滤和添加给数据库的行进行改变大家都会,但是要在原先的数据框中间插入一行怎么办呢?
可以用addrow,比如我想在原来的数据集raw的第二行之前插入一行,我可以用如下代码:
raw %>% add_row(row_num =
666, case_id =
"abc", generation =
4,
`infection date` =
as.Date(
"2020-10-10"), .before =
2)
该行的每一个变量都需要规定一下,没设定的都会空着,.before = 2的意思就是在原来数据框的第二行之前插入。
选择行也是用的比较多的,比如我就想选性别为女的行,或者我就想选择某些变量没有缺失的行等等,选择行我们是用filter,但是在以是否缺失为条件的时候大家不要去用filter(!is.na(column) & !is.na(column))这个时候推荐大家用drop_na,通过drop_na就可以将某个变量有确实的行全拿掉。
正常我们计算变量都是纵向依次计算的,比如最开始写的BMI计算的例子,有时候我们需要对一个观测的多个变量进行计算,比如一个病人有好多症状,我想对每个病人症状个数求和,本质上这是一个横向计算的问题,我就可以使用rowwise()函数,用完之后记得ungroup()一下:
row %>% rowwise() %>% mutate(num_symptoms = sum(c(fever, chills, cough, aches, vomit) ==
"yes")) %>% ungroup() %>% select(fever, chills, cough, aches, vomit, num_symptoms)
比如上面的代码就计算好了每一个病人的症状个数。
小结今天给大家写了数据处理中的一些函数和处理的一般流程:导入数据后先整体把握,第二步规范列名,列搞定之后第三步就是去重,去完重就是生成新变量,变量转换;最后一步就是行的选择和添加。每一个步骤中给大家写了一点点例子,感谢大家耐心看完,自己的文章都写的很细,重要代码都在原文中,希望大家都可以自己做一做,请转发本文到朋友圈后私信回复“数据链接”获取所有数据和本人收集的学习资料。如果对您有用请先记得收藏,再点赞分享。
也欢迎大家的意见和建议,大家想了解什么统计方法都可以在文章下留言,说不定我看见了就会给你写教程哦,有疑问欢迎私信。