我正在使用sapply()函数创建一个新的数据列。首先,根据我的原始观察数据,每个患者都会收到1-999之间的数字,每个数字都有一个独特的描述,但它们都属于27个类别中的1个。我的问题是原始数据中没有给出27个类别,因此我必须在字典中查找它们,其类别与1-999的数字相匹配。
以下是来自名为inova9的数据集的原始数据:
ID AgeGroup Race SexCode Org_DRGCode
9 9 75-84 White F 435
10 10 75-84 White F 441
11 11 45-54 White F 301
40 40 14-17 White F 775
70 70 75-84 White F 853
120 120 55-64 White M 395
这是我字典的一部分:
MSDRG_num MS.DRG_Descriptions_
1 1 Heart transplant or implant of heart assist system w MCC
2 2 Heart transplant or implant of heart assist system w/o MCC
3 3 ECMO or trach w MV 96+ hrs or PDX exc face, mouth & neck w maj O.R.
4 4 Trach w MV 96+ hrs or PDX exc face, mouth & neck w/o maj O.R.
5 5 Liver transplant w MCC or intestinal transplant
6 6 Liver transplant w/o MCC
New_CI_Category
1 Organ Transplant
2 Organ Transplant
3 General/Other Surgery
4 General/Other Surgery
5 Organ Transplant
6 Organ Transplant
这里有27个类别:
> levels(DRG$New_CI_Category)
[1] "Bariatric Surgery" "Behavioral"
[3] "Cardiovasc Medicine" "CV Surg - Open Heart"
[5] "General/Other Surgery" "GYN Med/Surg"
[7] "Hem/Onc Medicine" "Interventional Cardiology - EP"
[9] "Interventional Cardiology - PCI" "Medicine"
[11] "Neonates" "Neurology"
[13] "Neurosurgery - Brain" "Neurosurgery - Other"
[15] "Normal Newborns" "OB Deliveries"
[17] "OB Other" "Organ Transplant"
[19] "Ortho Medicine" "Ortho Surg - Other"
[21] "Ortho Surgery - Joints" "Rehab"
[23] "Spine" "Thoracic Surgery"
[25] "Unspecified" "Urology Surgery"
[27] "Vascular Procedure - Surgery or IR"
所以,我需要从我的字典中匹配inova9 $ Org_DRGCode和MSDRG_num,然后从DRG $ New_CI_Catgory中拉出相应的类别
我实施了以下内容:
ServiceLine1 = matrix(nrow=length(inova9$Org_DRGCode),ncol=1)
ServiceLine1 = sapply(1:length(inova9$Org_DRGCode),function(i)as.character(DRG$New_CI_Category[DRG$MSDRG_num==inova9$Org_DRGCode[i]]))
Svc = as.factor(ServiceLine1)
inova9 = data.frame(inova9,Svc)
正如您所看到的,我创建了一个列,现在我可以将它与我的原始数据一对一地合并。 我有四个这样的数据集,但它只适用于两个。另外两个我收到此错误:
> Svc = as.factor(ServiceLine2)
Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?
我的数据如下:
[[1]]
[1] "Neurology"
[[2]]
[1] "Medicine"
[[3]]
[1] "GYN Med/Surg"
[[4]]
[1] "Vascular Procedure - Surgery or IR"
[[5]]
[1] "Neurology"
[[6]]
[1] "Medicine"
sapply()是如何将我的矩阵变成列表的?如何阻止它发生?
答案 0 :(得分:3)
通过转换data.table,设置密钥然后简单加入,您可以省去头痛。
library(data.table)
DT.DRG <- as.data.table(DRG)
DT.dict <- as.data.table(your_dict)
## Set the key to what you want to join on
setkey(DT.DRG, ID)
setkey(DT.dict, MSDRG_num)
## Assign the column from DT.dict into DT.DRG, joining on the keys
DT.DRG[DT.dict, New_CI_Category := New_CI_Category]
意味着它们既是factor
又是character
等等
答案 1 :(得分:1)
这是因为sapply
是lapply
的包装器,它试图了解其返回结构。无论出于何种原因,当它无法解决时,它总是会回到列表中,因为这是lapply
返回的内容。
现在,我不完全确定为什么会发生这里。只是阅读你的代码,我也希望sapply
返回一个向量而不是一个列表。一种可能性是,对于i
的某些值,表达式as.character(DRG$New_CI_Category[DRG$MSDRG_num==inova9$Org_DRGCode[i]])
的长度大于1。您可以使用any(sapply(ServiceLine1, length) > 1)
进行检查。
在任何情况下,函数unlist
都会将列表压缩为向量,因此您可以执行as.factor(unlist(ServiceLine1))
。