对于其中一个向量中的每个唯一值,如何生成显示两个向量之间唯一对的数量的数据帧?

时间:2014-12-04 04:49:37

标签: r

首先,我为标题道歉。我真的不知道如何用一句话简洁地解释这个问题。

我有一个数据框,其中每一行代表患者到医院就诊的某些方面。单个患者可能有数千行进行数十次的医院就诊,每次住院就诊可能占了几排。

一列是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循环。

2 个答案:

答案 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快得多。