str_sub возвращает NA с помощью ifelse

Эта страница на официальном сайте mongodb адресует точно этот вопрос:

http://docs.mongodb.org/ecosystem/tutorial/model-data- for-ruby-on-rails /

Когда мы показываем наш список историй, нам нужно будет показать имя пользователя, разместившего историю. Если бы мы использовали реляционную базу данных, мы могли бы выполнить соединение с пользователями и магазинами и получить все наши объекты в одном запросе. Но MongoDB не поддерживает объединения, и поэтому время от времени требуется бит денормализации. Здесь это означает кеширование атрибута «имя пользователя».

Реляционные пуристы уже чувствуют себя неловко, как будто мы нарушаем какой-то универсальный закон. Но давайте иметь в виду, что коллекции MongoDB не эквивалентны реляционным таблицам; каждая из которых служит уникальной проектной цели. Нормализованная таблица обеспечивает атомный изолированный кусок данных. Однако документ более тесно представляет собой объект в целом. В случае сайта социальных новостей можно утверждать, что имя пользователя является неотъемлемой частью истории, опубликованной.

blockquote>

1
задан Sotos 17 January 2019 в 14:54
поделиться

3 ответа

Или, также как в 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
ответ дан niko 17 January 2019 в 14:54
поделиться

Причина в 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")
0
ответ дан Sotos 17 January 2019 в 14:54
поделиться

Почему бы не подставить 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
ответ дан Rui Barradas 17 January 2019 в 14:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: