str_sub возвращает NA с помощью ifelse - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь удалить последнюю букву во фрейме данных, если она соответствует '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 голосов
/ 17 января 2019

Или даже проще:

library(roperators)

df %>% mutate(PlayerName = PlayerName %-% "Z$|Q$")
0 голосов
/ 17 января 2019

Почему бы не основать 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" в конце строки.

0 голосов
/ 17 января 2019

Или также в 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
0 голосов
/ 17 января 2019

Причина в 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"

DATA

structure(list(PlayerName = c("JohnQ", "Robert", "AlbertZ", "JeffQ"
), Score = c(75L, 80L, 67L, 88L)), row.names = c(NA, -4L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...