如果与“ Z”或“ Q”匹配的数据框中的最后一个字母,我正在尝试删除。
数据框:
PlayerName Score
'JohnQ' 75
'Robert' 80
'AlbertZ' 67
'JeffQ' 88
代码:
data <- data %>% mutate(PlayerName = ifelse(stri_sub(data$PlayerName, -1) == 'Q'|
stri_sub(data$PlayerName, -1) == 'Z',
str_sub(data$PlayerName, end=-2),
data$PlayerName))
运行此代码时,我得到:
PlayerName Score
'NA' 75
'Robert' 80
'NA' 67
'NA' 88
不知道为什么会这样,我在str_sub(data$PlayerName, end=-2)
函数之外使用代码ifelse
时会返回正确的信息。
答案 0 :(得分:3)
原因是stri_sub(..., -2)
。您需要指定字符1到-2个字符,即
library(stringi)
with(df, ifelse(stri_sub(PlayerName, -1, -1) %in% c('Q', 'Z'),
stri_sub(PlayerName, 1, nchar(PlayerName)-2), PlayerName))
#[1] "Joh" "Robert" "Alber" "Jef"
数据
structure(list(PlayerName = c("JohnQ", "Robert", "AlbertZ", "JeffQ"
), Score = c(75L, 80L, 67L, 88L)), row.names = c(NA, -4L), class = "data.frame")
答案 1 :(得分:3)
为什么不以适当的regex为基础的R sub
?
library(tidyverse)
data <- data %>% mutate(PlayerName = sub("Z$|Q$", "", PlayerName))
data
# PlayerName Score
#1 John 75
#2 Robert 80
#3 Albert 67
#4 Jeff 88
说明:字符$
标记字符串的结尾,|
分隔替代模式。因此,"Z$|Q$"
与字符串末尾的"Z"
或"Q"
匹配。
答案 2 :(得分:2)
或者在base R
中也使用endsWith
和substr
index <- which(endsWith(df$PlayerName, 'Q') | endsWith(df$PlayerName, 'Z'))
df$PlayerName[index] <- substr(df$PlayerName[index],
rep(1, length(index)),
nchar(df$PlayerName[index])-1L)
df
# PlayerName Score
# 1 John 75
# 2 Robert 80
# 3 Albert 67
# 4 Jeff 88
答案 3 :(得分:2)
或更简单:
library(roperators)
df %>% mutate(PlayerName = PlayerName %-% "Z$|Q$")