0

这可能非常简单,但我在任何地方都找不到简单的解决方案。我正在尝试在 R 中创建一个脚本来计算一列中属于指定另一列的 3 个类别之一的条目。我有一份带有 ID 号(同一 ID 有多个条目)的临床患者列表,这些患者已被两项服务(a 或 b)看到。我需要知道服务 a 和服务 b 和服务 c 看到了多少 ID,但只计算一次服务的重复访问(所以基本上是每个服务至少使用过一次的患者数量) - 希望这使得有道理,这里举个例子来说明。

例子:

     身份证类别
     A001一
     A002一
     A002一
     A002 乙
     A003 乙
     A003 乙
     A005 c
     A001一
     A004 乙
     A004 乙
     A006 c
     A006一

输出应该是这样的:

     a=3
     b=3
     c=2

这就是我所做的,但我很卡住,这可能一点都不好!

 DataString<- matrix(nrow=dim(refnum)[1], ncol=1)
 for (i in 1:dim(refnum)[1]){
   DataString[i,1]<- paste(refnum[i,], collapse = '')
 }

 #generate vector of unique strings
 uniqueID<- unique(DataString)

 #create new matrix to store new IDs
 newID<- matrix(nrow=dim(data)[1], ncol=1)

 #initiate index n
 n<-0
 #loop through unique strings
 for (i in 1:dim(refnum)[1]){
   #increment n by 1 for each increment through unique strings
   n<- n+1
   #loop through data rows
   for (j in 1:dim(data)[1]){    
     #find matches with string i
     index<- which(DataString == uniqueID[i,1])
     #assign new ID to matching rows
     newID[index,1]<- n
   }
 }
4

2 回答 2

4

众多解决方案之一:

table(df[!duplicated(df), "Category"])

# a b c 
# 3 3 2 
于 2013-02-20T17:04:43.217 回答
3

如果到目前为止我对问题的解释是正确的,您也许可以使用以下内容:

table(unique(mydf)$Category)
# 
# a b c 
# 3 3 2 

不过,我有点谨慎,因为您的句子“所以基本上是至少使用过每项服务一次的患者数量”,这听起来像是您想要使用所有三种服务的患者,在这种情况下,答案是没有任何!

因此,aggregate可能也很有趣,至少可以更轻松地看到您正在处理的内容:

temp <- aggregate(Category ~ ID, mydf, function(x) sort(unique(x)))
temp
#     ID Category
# 1 A001        a
# 2 A002     a, b
# 3 A003        b
# 4 A004        b
# 5 A005        c
# 6 A006     a, c

这里的一个可能的优势是早期的表格(如果它是您需要的)也可以从aggregateby using的输出中table(unlist(temp$Category))获得,因此您可以通过 ID 查看服务的使用情况以及您需要的任何摘要。

于 2013-02-20T17:18:13.110 回答