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

mEv*_*ans 5 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
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用的代码:

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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在我提供的2个示例行中,我希望保留第一行但是抛出第二行,因为它没有我想要的任何代码.我提供的代码示例不起作用 - 我得到一个39,019"1"值的向量.因此我猜测apply语句在某种程度上被视为逻辑,但我知道并非所有行都有感兴趣的代码,所以在这种情况下我会预期1和0.

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

Cha*_*ase 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
Run Code Online (Sandbox Code Playgroud)