在几列中选择匹配条件的行

时间:2019-04-15 17:19:48

标签: r conditional-statements

我有一个超过200万行和几列的数据集。一些列是医院代码,对应于每个患者在住院期间的所有状况。我需要针对每个条件进行一些汇总,因此我试图创建一个数据集,其中将包含有关单个奇异条件的信息。

代码有5位数字,但是有时我想选择以三位数字开头的代码(其余两位数字不乱码),例如,我希望每一行的代码都在所有列中以401开头包含这些代码。小例子:

id dx_1 dx_2 dx_3 dx_n
1  401  
2  2500 4011
3  18524

我想要ID 1和2。我尝试了一些操作,但是出现错误,而且速度很慢。任何指针或建议都将受到欢迎。如果不清楚,我将尝试提供更多信息。

final_DB[apply(grep(paste("^", i, sep=""), final_DB[,10:29]), 1, any),]

i对应于我想要的数字,因此在这种情况下,i <- 401和第10到29列都是此代码可能所在的所有列。

2 个答案:

答案 0 :(得分:2)

一个选择是filter_at,以选择感兴趣的列,检查是否有任何变量在开始时具有substr,401来过滤行

library(dplyr)
df1 %>%
    filter_at(vars(starts_with("dx")), any_vars(substr(., 1, 3) == '401'))
#    id dx_1 dx_2 dx_3 dx_n
#1  1  401   NA   NA   NA
#2  2 2500 4011   NA   NA

或使用base R,循环浏览感兴趣的列(在这种情况下,除第一列外的所有列),使用grepl并检查pattern“ ^ 401”是否为是否存在-返回逻辑list的{​​{1}},我们将vector转换为带有Reduce的单个逻辑vector,并使用它来对数据

|

关于OP帖子中的问题

df1[Reduce(`|`, lapply(df1[-1], grepl, pattern = "^401")), ]

此处final_DB[apply(grep(paste("^", i, sep=""), final_DB[,10:29]), 1, any),] 应用于data.frame而不是grep,并且vector适用于grep。为了更正它,我们在各行中循环(虽然效率很低-只是为了更正代码)

vector/matrices

数据

i1 <- apply(final_DB[, 10:29], 1, function(x) any(grepl(paste("^", i, sep=""), x)))

答案 1 :(得分:2)

我将使用mtcars演示一种方法(在R中)。 (顺便说一句:我不清楚您的数据是character还是numeric,但没关系:grep*函数会很高兴地转换为character来查找内容,例如grepl("^123", 122:124)中的内容…尽管浮点正则表达式显然应该与grain-of-salt一起使用。)

假设我们希望每行以20到25开头的行:

mt <- mtcars[1:10, 1:7]
sapply(mt, grepl, pattern = "^2[0-5]")
#         mpg   cyl  disp    hp  drat    wt  qsec
#  [1,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
#  [2,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
#  [3,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
#  [4,]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
#  [5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#  [6,] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE
#  [7,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
#  [8,]  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
#  [9,]  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
# [10,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE

突出显示这些是什么:

mt
#                    mpg   cyl    disp    hp   drat      wt    qsec
# Mazda RX4        *21.0*    6   160.0   110   3.90   2.620   16.46
# Mazda RX4 Wag    *21.0*    6   160.0   110   3.90   2.875   17.02
# Datsun 710       *22.8*    4   108.0    93   3.85   2.320   18.61
# Hornet 4 Drive   *21.4*    6  *258.0*  110   3.08   3.215   19.44
# Hornet Sportabout 18.7     8   360.0   175   3.15   3.440   17.02
# Valiant           18.1     6  *225.0*  105   2.76   3.460  *20.22*
# Duster 360        14.3     8   360.0  *245*  3.21   3.570   15.84
# Merc 240D        *24.4*    4   146.7    62   3.69   3.190  *20.00*
# Merc 230         *22.8*    4   140.8    95   3.92   3.150  *22.90*
# Merc 280          19.2     6   167.6   123   3.92   3.440   18.30

现在可以使用:

mt[ rowSums(sapply(mt, grepl, pattern = "^2[0-5]")) > 0, ]
#                 mpg cyl  disp  hp drat    wt  qsec
# Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46
# Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02
# Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61
# Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44
# Valiant        18.1   6 225.0 105 2.76 3.460 20.22
# Duster 360     14.3   8 360.0 245 3.21 3.570 15.84
# Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00
# Merc 230       22.8   4 140.8  95 3.92 3.150 22.90

如果只需要检查一组特定的列,则将列选择添加到mt中的sapply中:

mt[ rowSums(sapply(mt[,c(1,4,7)], grepl, pattern = "^2[0-5]")) > 0, ]
#                 mpg cyl  disp  hp drat    wt  qsec
# Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46
# Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02
# Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61
# Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44
# Valiant        18.1   6 225.0 105 2.76 3.460 20.22
# Duster 360     14.3   8 360.0 245 3.21 3.570 15.84
# Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00
# Merc 230       22.8   4 140.8  95 3.92 3.150 22.90