str_sub以ifelse返回NA

时间:2019-01-17 14:45:20

标签: r dataframe if-statement dplyr

如果与“ Z”或“ Q”匹配的数据框中的最后一个字母,我正在尝试删除。

数据框:

PlayerName    Score
'JohnQ'         75
'Robert'        80
'AlbertZ'       67
'JeffQ'         88

代码:

如果字符串的最后一个字母删除“ Z”或“ Q”

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时会返回正确的信息。

4 个答案:

答案 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中也使用endsWithsubstr

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$")