字符串与行匹配的子集行

时间:2018-03-10 11:15:47

标签: r

我有以下数据框:

die

我希望保留 Code Eqpmnt 123 501R 234 602 456 503 546 504 667 SK01 789 507 678 EK09 Eqpmnt开头的行,同时5 0r 6之类的设备名称最终应转换为501R <{1}} / p>

我想要的数据框将是

R

我怎样才能在R中实现这一目标?

6 个答案:

答案 0 :(得分:3)

通过基础R的想法,

df$Eqpmnt <- as.numeric(gsub('\\D+', '', df$Eqpmnt))
df[df$Eqpmnt %/% 100 %in% c(5, 6),]

给出,

   Code Eqpmnt
1  123    501
2  234    602
3  456    503
4  546    504
6  789    507

答案 1 :(得分:1)

基本R解决方案类似于@Sotos:

使用gsub()删除字母,但使用grep代替%in%

进行提取
df2 <- df[grep("^5|6", Eqpmnt)]
df2$Eqpmnt <- gsub("[A-Z]", "", df2$Eqpmnt)
   ode Eqpmnt
1: 123    501
2: 234    602
3: 456    503
4: 546    504
5: 789    507

答案 2 :(得分:1)

使用tidyversedplyr的{​​{1}}解决方案可以是:

stringr

我们可以避免使用library(dplyr) library(stringr) df %>% filter(str_detect(str_sub(Eqpmnt, 1, 1), '5|6')) %>% mutate(Eqpmnt = str_remove(Eqpmnt, "[A-Z]")) 在正则表达式中使用str_sub作为Sotos提及:

^

返回:

df %>% 
  filter(str_detect(Eqpmnt, '^5|6')) %>% 
  mutate(Eqpmnt = str_remove(Eqpmnt, "[A-Z]"))

答案 3 :(得分:1)

这是一个使用data.table的选项,我们使用grep对数据进行子集,并通过删除末尾的字母'R'来确定'Eqpmnt'

library(data.table)
setDT(df1)[grepl('^[56]', Eqpmnt)][, Eqpmnt := sub("R$", "", Eqpmnt)][]
#   Code Eqpmnt
#1:  123    501
#2:  234    602
#3:  456    503
#4:  546    504
#5:  789    507

或来自str_sub

str_removetidyverse
library(tidyverse)
df1 %>% 
   filter(str_sub(Eqpmnt, 1, 1) %in% 5:6) %>%
   mutate(Eqpmnt = str_remove(Eqpmnt, "R$")) 

答案 4 :(得分:0)

这实际上只适用于数字。我误读了你的问题。

library(dplyr)
filter(your_dataframe, between(Epmnt, 500, 599))

对于角色:

toy <- data.frame(x = paste(c(100, 200, 300, 400, 401, 410, 407, 408), sample(LETTERS, 8), sep = ""))
filter(toy, x %in% grep("^4|^3", x, value = TRUE))
     x
1 300J
2 400I
3 401Z
4 410C
5 407E
6 408W

答案 5 :(得分:0)

df %>% 
  mutate(Eqpmnt = gsub("[^\\d*]", "", df$Eqpmnt, perl = TRUE)) %>%
  filter(str_detect(df$Eqpmnt, "^5|6"))