4

我的问题最好通过三个问题来解释。

1)。有没有办法使用相同的条件使用索引(我在下面的示例中使用列名)搜索多个列?我想知道是否有更优雅的实现方式(我在下面有另一种方法)?

sepsis <- subset(allhospitals, diag_p %in% c(78552, 99592) | 
                 odiag1 %in% c(78552, 99592) | 
                 odiag2 %in% c(78552, 99592) |  
                 odiag3 %in% c(78552, 99592) |
                 ## etc. etc.

2.) 在对数据进行子集化后,我想计算每列同时存在两种条件的行数(即在 diag_p、odiag1、odiag2 等中出现了多少次 78552 和 99552)。

3.)最后,我想进行上面的计算,并按另一列中的因子对其进行切片。

我的策略(这很糟糕)是:a.)创建列索引向量;然后 b.) 应用两个函数(每个条件一个)来对数据进行子集化并计算行数;c.) 使用列索引作为唯一列创建一个新数据框(每个条件一个);最后 d.) 将“应用”与我在列索引(即新数据框的唯一列)上编写的函数一起使用。

## indices for all columns of interest
ind <- c(35, seq(from=39, to=85, by=2)) 

## create one data frame and function per ICD-9 code (i.e., condition)
f7 <- function(x) nrow(subset(allhospitals, allhospitals[x]=="78552"))
t.7 <- data.frame("diag"=ind)
t.7$freq <- apply(t.7,1,f7)

f9 <- function(x) nrow(subset(allhospitals, allhospitals[x]=="99592"))
t.9 <- data.frame("diag"=ind)
t.9$freq <- apply(t.9,1,f9)

然后我将 rbind 所有这些并为我的整个数据集获取一个聚合值。问题是我需要针对几个单独的因素执行此操作,从而使我的方法非常乏味。plyr 包的所有尝试都没有结果,虽然我对 R 比较陌生,所以也许这里也有一个解决方案。

更新:

我再次尝试了 plyr 包并得到了接近我想要的东西,尽管我必须一次执行一个条件(“99592”)和一列(“odiag1”),因为我需要按每个条件获取行数 - - 不适用于所有条件的组合。如您所见,我的代码仍然看起来很难看。无论如何,我得到了一个数据框,我必须将其重塑为“长”格式,因为我的数据集非常宽且难以使用。这是一些代表性数据和我更新的 ddply 方法:

样本数据:

    id  patzip  adm_yr  diag_p  odiag1 odiag2  odiag3  odiag4  etc.  etc.  etc.
Hosp A   93077    2010   99592   16932  22107   78552      NA
Hosp B   99804    2011   16932   99592  78552   12988      NA
Hosp B   94503    2010   22107   78552  12988   99592   16932
Hosp A   93013    2010   12988   22107  12988      NA      NA
Hosp C   93112    2009   99592   78552  22107      NA      NA

我的新方法:

library(plyr)
df <- ddply(allhospital, .(id), summarize, diag_p = length(id[diag_p == 99592]), 
        odiag1 = length(id[odiag1 == 99592]), odiag2 = length(id[odiag2 == 99592]),
        odiag3 = length(id[odiag3 == 99592]), odiag4 = length(id[odiag4 == 99592]),
        odiag5 = length(id[odiag5 == 99592]), odiag6 = length(id[odiag6 == 99592]),
        odiag7 = length(id[odiag7 == 99592]), odiag8 = length(id[odiag8 == 99592]),
        odiag9 = length(id[odiag9 == 99592]), odiag10 = length(id[odiag10 == 99592]),
        odiag11 = length(id[odiag11 == 99592]), odiag12 = length(id[odiag12 == 99592]),
        odiag13 = length(id[odiag13 == 99592]), odiag14 = length(id[odiag14 == 99592]),
        odiag15 = length(id[odiag15 == 99592]), odiag16 = length(id[odiag16 == 99592]),
        odiag17 = length(id[odiag17 == 99592]), odiag18 = length(id[odiag18 == 99592]),
        odiag19 = length(id[odiag19 == 99592]), odiag20 = length(id[odiag20 == 99592]),
        odiag21 = length(id[odiag21 == 99592]), odiag22 = length(id[odiag22 == 99592]),
        odiag23 = length(id[odiag23 == 99592]), odiag24 = length(id[odiag24 == 99592]))

更新 2:

这是预期结果的一种方式:

    id     diag  Count.78552  Count.99552
Hosp A   diag_p            4            0
Hosp A   odiag1           10            8
Hosp A   odiag2           17           16
Hosp A   odiag3            9           10
Hosp B   diag_p            5            8
Hosp B   odiag1            1            3
Hosp B   odiag2            0            1
Hosp B   odiag3            0            0
4

1 回答 1

0

多个列的条件相同。

vn_cond <- c("diag_p","odiag1","odiag2","odiag3")# columns to meet condition
cond_set <- c(78552, 99592)# values in condition set
#
# sapply - repeats conditions 
# rowSums(...)>0 - at least one TRUE in row
#
sepsis <- allhospitals[rowSums(sapply(allhospitals[vn_cond],
                                      "%in%", cond_set))>0,]

编辑

require(reshape2)

hosp_long <- melt(allhospitals[c("id",vn_cond)],
                  id.vars="id", na.rm=TRUE,
                  variable.name="var_diag")
hosp_long <- transform(hosp_long,diag_78552 = 0L+(value == 78552),
                                 diag_99592 = 0L+(value == 99592))
hosp_long <- melt(subset(hosp_long,select=-value), id.vars=c("id","var_diag"),
                  variable.name="var_cond")
out <- dcast(hosp_long, id+var_diag~var_cond, sum)
于 2012-12-26T08:27:36.103 回答