我有以下数据框:
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中实现这一目标?
答案 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)
使用tidyverse
和dplyr
的{{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_remove
和tidyverse
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"))