首页 > 解决方案 > 如何过滤()包含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)) 

先感谢您。

标签: rdataframedplyr

解决方案


让我们先获取一些可重现的数据:

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)此数据。


推荐阅读