我有一个超过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列都是此代码可能所在的所有列。
答案 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