R 为什么Sappy()要把我的矩阵变成一个我无法考虑的列表?

R 为什么Sappy()要把我的矩阵变成一个我无法考虑的列表?,r,sapply,R,Sapply,我正在使用sappy()函数创建新的数据列。首先,根据我的原始观察数据,每个患者都会收到一个介于1-999之间的数字,每个数字都有一个唯一的描述,但它们都属于27个类别中的1个。我的问题是原始数据中没有给出27个类别,因此我必须在字典中查找它们,字典中的类别与数字1-999匹配 以下是标题为inova9的数据集中的原始数据: ID AgeGroup Race SexCode Org_DRGCode 9 9 75-84 White F 435 10

我正在使用sappy()函数创建新的数据列。首先,根据我的原始观察数据,每个患者都会收到一个介于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\u DRGCode与字典中的MSDRG\u num进行匹配,然后从DRG$New\u CI\u 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()是如何将我的矩阵变成一个列表的?我如何阻止它发生

通过转换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]
库(data.table)

DT.DRG通过转换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]
库(data.table)

DT.DRG之所以会出现这种情况,是因为
sapply
lappy
的包装器,它试图对其返回结构进行智能化。无论出于何种原因,当它无法找到它时,它总是返回到一个列表,因为这就是
lappy
返回的结果

现在,我不完全确定为什么会发生这种情况。只要阅读您的代码,我还希望
sapply
返回一个向量,而不是一个列表。一种可能性是,对于
i
的某些值,表达式
as.character(DRG$New\u CI\u Category[DRG$MSDRG\u num==inova9$Org\u DRGCode[i]])
的长度大于1。您可以使用
any(sapply(ServiceLine1,length)>1)
进行检查


在任何情况下,函数
unlist
都会将列表压缩为向量,因此您可以将
作为.factor(unlist(ServiceLine1))
发生这种情况,因为
sapply
lappy
的包装器,它试图巧妙地处理其返回结构。无论出于何种原因,当它无法找到它时,它总是返回到一个列表,因为这就是
lappy
返回的结果

现在,我不完全确定为什么会发生这种情况。只要阅读您的代码,我还希望
sapply
返回一个向量,而不是一个列表。一种可能性是,对于
i
的某些值,表达式
as.character(DRG$New\u CI\u Category[DRG$MSDRG\u num==inova9$Org\u DRGCode[i]])
的长度大于1。您可以使用
any(sapply(ServiceLine1,length)>1)
进行检查


在任何情况下,
unlist
函数都会将列表压缩为一个向量,因此您可以将
作为.factor(unlist(ServiceLine1))

…可能值得指出的是,这很可能可以通过简单的索引在一行中完成(假设字典在整数代码中没有任何间隙)除非性能是个问题,
merge
也会起作用。@joran真的!我确实经常使用这些键值类型字典though@RicardoSaporta谢谢你提供了一个全新的范例。我不熟悉这个软件包,但我所做的就像MapReduce,所以这很有帮助……也许值得指出的是,这可能可以通过简单的索引在一行中完成(假设字典在整数代码中没有任何间隙),除非性能是一个问题,
merge
也能奏效。@joran真的!我确实经常使用这些键值类型字典though@RicardoSaporta谢谢你提供了一个全新的范例。我不熟悉这个软件包,但我所做的就像MapReduce,所以这很有帮助。
c(sappy(…),recursive=TRUE)
unlist(sappy(…)
simplify=“array”
sapply
中的
c(sappy(…),recursive=TRUE)
unlist(sappy(…)
simplify=“array”
sapply
中,有时工作时我没有想到长度大于1,现在我对sapply()为什么这样做有了更多的了解。另一种取消矩阵列表的方法是do.call(rbind,ServiceLine1),我刚刚在另一个论坛中找到了它。谢谢你的帮助help@VectorTraverse该代码将生成一个列矩阵,它不等价于向量。R使得数据类型很容易变得非常松散。不幸的是,由于R并不总是如此自洽,而且包开发人员在选择(或不选择)处理变量类型方面有很大的回旋余地,这种草率会导致许多令人恼火的错误和意外行为。R手册简介的第2-6章概述了不同的数据结构。这听起来好像很多,但只有一些“基本”数据类型,而且这是一本容易浏览的手册。我没有想到长度会大于1,现在我对sapply()为什么会这样做有了更多的了解。另一种取消矩阵列表的方法是do.call(rbind,ServiceLine1),我刚刚在另一个论坛中找到了它。谢谢你的帮助help@VectorTraverse该代码将生成一个列矩阵,它不等价于向量。R使得数据类型很容易变得非常松散。不幸的是,由于R并不总是如此自洽,而且包开发人员在选择(或不选择)处理变量类型方面有很大的回旋余地,这种草率会导致许多令人恼火的错误和意外行为。R手册简介的第2-6章概述了不同的数据结构。这听起来好像很多,但只有少数“基本”数据类型,这是一个ea