R:根据某些列中出现的一组感兴趣的值从数据框中选择行

时间:2012-05-07 15:46:56

标签: r rows apply

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

数据框是18列乘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。

有没有更好的方法来执行此行选择任务?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

使用x != NA可以更好地构建

!is.na(x),但您必须认识到这会返回逻辑向量。因此,您将获取逻辑向量的结果,然后检查结果是否在mydiag中。我猜你只是想拿一些不是na的值,检查一下这些是否在mydiag中。

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

会更好地工作。但是你甚至不需要检查NA,因为NA不在你的向量中,所以x中的任何NA元素都将返回false x %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, ]