首先,我为标题道歉。我真的不知道如何用一句话简洁地解释这个问题。
我有一个数据框,其中每一行代表患者到医院就诊的某些方面。单个患者可能有数千行进行数十次的医院就诊,每次住院就诊可能占了几排。
一列是Medical.Record.Number,对应于患者ID,另一列是Patient.ID.Visit,对应于个别医院就诊的ID。我想计算每个病人每次就诊的次数。
例如:
Medical.Record.Number Patient.ID.Visit
AAAXXX 1111
AAAXXX 1112
AAAXXX 1113
AAAZZZ 1114
AAAZZZ 1114
AAABBB 1115
AAABBB 1116
将产生以下内容:
Medical.Record.Number Number.Of.Visits
AAAXXX 3
AAAZZZ 1
AAABBB 2
我目前使用的解决方案如下,其中“数据”是我的数据帧:
#this function returns the number of unique hospital visits associated with the
#supplied record number
countVisits <- function(record.number){
visits.by.number <- data$Patient.ID.Visit[which(data$Medical.Record.Number
== record.number)]
return(length(unique(visits.by.number)))
}
recordNumbers <- unique(data$Medical.Record.Number)
visits <- integer()
for (record in recordNumbers){
visits <- c(visits, countVisits(record))
}
visit.counts <- data.frame(recordNumbers, visits)
这很有效,但速度很慢。我正在处理数百万行数据,所以我想要一些有效的东西。从我对R的了解很少,我知道通常有一种更快的方式来做事而不使用for循环。
答案 0 :(得分:2)
在取出重复项后,这基本上看起来像table()
操作。首先,一些样本数据
#sample data
dd<-read.table(text="Medical.Record.Number Patient.ID.Visit
AAAXXX 1111
AAAXXX 1112
AAAXXX 1113
AAAZZZ 1114
AAAZZZ 1114
AAABBB 1115
AAABBB 1116", header=T)
然后你可以做
tt <- table(Medical.Record.Number=unique(dd)$Medical.Record.Number)
as.data.frame(tt, responseName="Number.Of.Visits") #to get a data.frame rather than named vector (table)
# Medical.Record.Number Number.Of.Visits
# 1 AAABBB 2
# 2 AAAXXX 3
# 3 AAAZZZ 1
或者您也可以将此视为聚合问题
aggregate(Patient.ID.Visit~Medical.Record.Number, dd, function(x) length(unique(x)))
# Medical.Record.Number Patient.ID.Visit
# 1 AAABBB 2
# 2 AAAXXX 3
# 3 AAAZZZ 1
答案 1 :(得分:1)
有很多方法可以做到这一点,@ MrFlick提供了一些非常有效的方法。就个人而言,我喜欢data.table
包。它在大型数据帧上更快,我发现逻辑比基本功能更直观。如果您遇到执行时间问题,我会查看它。
library(data.table)
med.dt <- data.table(med_tbl)
num.visits.dt <- med.dt[ , num_visits = length(unique(Patient.ID.Visit)),
by = Medical.Record.Number]
data.Table
应该比大表上的data.frame
快得多。