计算R中另一列中指定的3个类别的条目

时间:2013-02-20 17:00:08

标签: r count

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

示例:

     ID    Category
     A001  a
     A002  a 
     A002  a
     A002  b
     A003  b
     A003  b
     A005  c
     A001  a
     A004  b
     A004  b
     A006  c
     A006  a

输出应该是这样的:

     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
   }
 }

2 个答案:

答案 0 :(得分:4)

众多解决方案之一:

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

# a b c 
# 3 3 2 

答案 1 :(得分: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

这里的一个可能的优点是,通过使用aggregatetable(unlist(temp$Category))的输出也可以使用早期的列表(如果它是你需要的),这样你就可以看到服务的利用率ID和您需要的任何摘要。