通过三个问题可以最好地解释我的问题。
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。)使用'apply'和我在列索引上写的函数(即新数据框的唯一列)。
## 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)
然后我将对所有这些进行调整并获得整个数据集的聚合值。问题是我需要针对几个因素进行此操作,从而使我的方法变得非常繁琐。使用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
答案 0 :(得分: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)