R - 通过在多列

时间:2015-12-03 00:30:29

标签: r

我是一名相对较新的R用户,他正在对行政健康数据进行分析。

这个社区在提升我对R及其“R”的理解方面提供了很大的帮助。功能 - 然而,在花了一整天坚持这个问题,并且无法找到解决方案(到目前为止)之后,我决定第一次发布。

简言之,

我的数据集包含多个诊断向量(总共25列)可以包含各种诊断代码'或者是NA。

每行对应于与健康系统的一次遭遇(可能包括多个诊断代码 - 最多25个),但是我只对具有诊断代码(在25个字段之一中)的遭遇感兴趣特别感兴趣的条件。

我遇到的挑战是我想要搜索的疾病诊断代码对应于实际数据中特定诊断代码的开头。 (例如,我想找到所有以M16和M17开头的代码 - 数据中的这些代码将显示为M161或M1611等。)

我通过这个网站找到了一些代码,它允许我搜索数据中的25个诊断代码字段,查找感兴趣的诊断代码的指定列表,并将数据子集化到只有感兴趣的代码的那些遭遇发生。

我遇到的问题是我必须准确指定代码,因为我无法使用通配符进入函数以仅使用前几个字符搜索任何诊断代码(例如,M1611,M1622) (例如M16)。

我创建了一些简单的数据来复制我现在可以做的事情。我希望能够使用我指定的列表代码(例如M16,M17和通配符运算符来得出相同的结果(' data-subset')。

我怀疑这会涉及grep,但对于我的生活,我无法想出办法。非常感谢任何帮助,我希望我提供了足够清晰的问题和代码。

#make a simple data set
id = c(1,2,3,4,5,6)
pr1 = c("M151", "M141", "M161", "M177", "M197", "M200")
pr2 = c("M100", "M101", "M120", "M135", "M144", "M190")
pr3 = c("M210", "M205", "M167", "M121", "M166", "M174")
data <-  data.frame(id,pr1,pr2,pr3)

#list of columns to search
list <- names(data)[2:4]

#codes of interest
codes <- c("M161","M174","M177","M167","M166")

# subset the data to include only those that have a code of interest
data_subset <- data[apply(apply(as.matrix(data[list]), c(1,2), `%in%`, codes), 1, any),]

提前感谢您的帮助。

为清晰起见编辑1 - 我的最终目标是产生如下输出:

row.names   id  pr1     pr2     pr3
3            3  M161    M120    M167
4            4  M177    M135    M121
5            5  M197    M144    M166
6            6  M200    M190    M174

它仅保留原始集合中具有感兴趣值的行,但保留data.frame的结构。如下所述 - 一个额外的挑战是我在一个安全的研究环境中工作,我无法访问互联网,因此无法随意安装包...

编辑2:另一个解决方案(通过一位才华横溢的朋友)以及下面发布的那个:

# regexes that we want to match
regexcodes <- c("^M16", "^M17")

# subset the data to include only those that have a code of interest
data_subset <- data[apply(apply(as.matrix(data[list]), c(1,2), function(u){
  # u corresponds to the actual string

  # this combines your regex into the following: "^M16|^M17" - it is basically
  # just an OR operator in a regex
  combined_regex <- paste(regexcodes,collapse="|")

  # grepl returns true if u matches the regex
  grepl(combined_regex, u, perl=TRUE)
}), 1, any),]

1 个答案:

答案 0 :(得分:2)

以下是一种快速方法:

library(dplyr)
library(tidyr)
library(stringi)

long_form = 
  data %>%
  gather(diagnostic, code, -id) %>%
  merge(data_frame(partial_code = codes)) %>%
  filter(code %>% stri_detect_fixed(partial_code))

编辑:以下是如何从原始数据中恢复匹配的行:

data %>%
  semi_join(long_form)