这可能非常简单但我无法在任何地方找到一个简单的解决方案。我正在尝试在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
}
}
答案 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
这里的一个可能的优点是,通过使用aggregate
,table(unlist(temp$Category))
的输出也可以使用早期的列表(如果它是你需要的),这样你就可以看到服务的利用率ID和您需要的任何摘要。