5

我有大量的就诊记录数据框。我只想选择在我感兴趣的一组指定诊断代码中至少找到列出的 11 个诊断代码中的一个的行。

数据框为 18 列 x 39,019 行。我对 6:16 栏中的诊断代码感兴趣。以下是这 11 个诊断列的数据样本(用于保护可识别信息):

diag1 diag2 diag3 diag4 diag5 diag6 diag7 diag8 diag9 diag10 diag11
786   272   401   782    250  91912  530    NA    NA    NA     NA   
845   530   338   311    NA    NA    NA     NA    NA    NA     NA

这是我尝试使用的代码:

mydiag <- c(401, 410, 411, 413, 415:417, 420:429, 434, 435, 444, 445, 451, 460:466, 480:486, 490:493, 496, 786)
y = apply(dt[,paste("diag", 1:11, sep="")], 1, function(x) sum((any(x !=NA %in% mydiag))))
y = as.data.frame(y)

如您所见,在我提供的 2 个示例行中,我想保留第一行但丢弃第二行,因为它没有我想要的任何代码。我提供的代码示例不起作用——我得到了一个包含 39,019 个“1”值的向量。所以我猜apply语句被解读为某种逻辑,但我知道并非所有行都有感兴趣的代码,所以在这种情况下我会期望1和0。

有没有更好的方法来完成这个行选择任务?

4

2 回答 2

5

我认为你!=NA在那里的位使事情过于复杂。由于 NA 中没有出现mydiag,因此您可以完全删除它。因此,您的 apply 语句可以变为:

goodRows <- apply(dat, 1, function(x) any(x %in% mydiag))
dat[goodRows,]
#---------------
  diag1 diag2 diag3 diag4 diag5 diag6 diag7 diag8 diag9 diag10 diag11
1   786   272   401   782   250 91912   530    NA    NA     NA     NA
于 2012-05-07T16:00:44.033 回答
2

问题来自您的功能function(x) sum((any(x !=NA %in% mydiag)))

x != NA可以更好地构造使用!is.na(x),但您必须认识到这会返回一个逻辑向量。因此,您正在获取逻辑向量的结果,然后检查结果是否在 mydiag.xml 中。我猜您只是想获取不是 na 的值并检查其中是否有任何值在 mydiag 中。

x[!is.na(x)] %in% mydiag

会为此工作得更好。但是您实际上甚至不需要检查 NA,因为 NA 不在您的向量中,因此 x 中的任何元素 NA 将返回 falsex %in% mydiag

function(x){any(x %in% mydiag)}

是一种获得逻辑值的好方法,可以告诉您该行是否符合您的条件。

# Get the row numbers of the rows you want
id = apply(dt[,paste("diag", 1:11, sep="")], 1, function(x){any(x %in% mydiag)})
# Just grab those rows
y <- dt[id, ]
于 2012-05-07T15:59:09.860 回答