r - 如何过滤()包含dplyr中由文本和数字组成的列中的文本的行?
问题描述
我有一个相当大的数据集,名为e
. 一个连续的协变量e$rad.dose
应该在 0 - 60 之间,但是,我观察到四行包含文本而不是数字。
问题:如何应用 dplyr 删除这四行?
我知道几个 baseR 解决方案,但我正在努力改进我的dplyr
.
> table(e$rad.dose)
0 12 12,5 14 15 16 21,6
156 3291 4 1 1 6 2 1
22 24 25 26 27,5 28 33,3 35
1 14 7 1 1 7 1 1
36 45 48 49,4 5,4 50 50,4 52
1 2 1 1 17 12 9 9
52,2 53,2 53,24 54 54,4 54,6 55 55,5
1 1 1 94 1 1 1 1
55,8 56 56,7 57 57,6 58 59,4 60
1 14 1 1 2 3 26 41
60,9 64 68 gammaknife GK
1 1 1 2 2
我努力了
filter(simpson %in% 1:3, age>=18, rad.dose!= c("gammaknife","GK"))
但还剩两行
> table(e$rad.dose)
0 12 12,5 14 15 16 21,6
32 2276 0 0 0 0 0 0
22 24 25 26 27,5 28 33,3 35
0 7 0 0 0 0 0 1
36 45 48 49,4 5,4 50 50,4 52
0 1 0 0 5 3 1 9
52,2 53,2 53,24 54 54,4 54,6 55 55,5
0 0 1 21 0 0 0 0
55,8 56 56,7 57 57,6 58 59,4 60
0 4 0 0 0 1 7 19
60,9 64 68 gammaknife GK
0 1 0 1 1
我也尝试过str_detect
,但并没有解决它 - 或者,至少,我错误地应用了它:
filter(simpson %in% 1:3, age>=18, str_detect(rad.dose, c("gammaknife","GK")==FALSE))
先感谢您。
解决方案
让我们先获取一些可重现的数据:
e <- data.frame(rad.dose = c(rnorm(10), LETTERS))
e$rad.dose <- gsub(".", ",", e$rad.dose, fixed = TRUE)
e
#> rad.dose
#> 1 -0,713359526629519
#> 2 1,17199694030257
#> 3 -0,255927297100446
#> 4 0,904135913625966
#> 5 0,44009842543169
#> 6 2,05720978460597
#> 7 0,0285732465139118
#> 8 -0,030136802990553
#> 9 -0,291809792426389
#> 10 0,30677039655244
#> 11 A
#> 12 B
#> 13 C
#> 14 D
#> 15 E
#> 16 F
#> 17 G
#> 18 H
#> 19 I
#> 20 J
#> 21 K
#> 22 L
#> 23 M
#> 24 N
#> 25 O
#> 26 P
#> 27 Q
#> 28 R
#> 29 S
#> 30 T
#> 31 U
#> 32 V
#> 33 W
#> 34 X
#> 35 Y
#> 36 Z
据我所见,该rad.dose
列存在三个问题:列中有文本,数字中有逗号,并且数字列被格式化为字符(整个内容,否则您将无法存储里面的文字)。在继续之前,我会先纠正这个
library(dplyr)
library(stringr)
e %>%
filter(str_detect(rad.dose, "[0-9,]+")) %>% # only allow values which consist entirly of numbers and comma
mutate(rad.dose = as.numeric(str_replace(rad.dose, ",", "."))) # replace comma with dot and transform as numeric
#> rad.dose
#> 1 -0.71335953
#> 2 1.17199694
#> 3 -0.25592730
#> 4 0.90413591
#> 5 0.44009843
#> 6 2.05720978
#> 7 0.02857325
#> 8 -0.03013680
#> 9 -0.29180979
#> 10 0.30677040
现在您可以使用filter(simpson %in% 1:3, age>=18)
此数据。
推荐阅读
- java - 使用正确的同步方式避免数据丢失
- azure - 如何使用 Azure CLI(az ad app)创建范围
- java - .java 使用或覆盖已弃用的 API。& 使用 -Xlint:deprecation 重新编译以获取详细信息
- javascript - 具有 Promises 的不同函数调用类型
- r - sub() 函数替换多个项目
- python - 如何按字段/字符串而不是按字符创建 csv.reader() 索引?
- java - setIconImage intellij 项目 javax.swing
- php - laravel LoginController 中的这个 traitLogout 函数
- c++ - Boost Signals2 将 Slot 传递给成员函数以进行断开连接
- devops - 在 Azure 数据工厂的链接服务中参数化集成运行时