добавить счетчик хода для последовательных строк в векторе - PullRequest
0 голосов
/ 16 мая 2019

Я хотел бы добавить число, указывающее на x ^ вхождение слова в векторе. (Таким образом, этот вопрос отличается от Создайте столбец с дублированными значениями, уникальными в кадре данных , потому что у меня есть простой вектор и я стараюсь избежать лишних затрат при его преобразовании в data.frame).

например. для вектора:

book, ship, umbrella, book, ship, ship

вывод будет:

book, ship, umbrella, book2, ship2, ship3

Я решил это сам, переместив вектор в кадр данных и затем используя функцию группировки. Это похоже на использование кувалды, чтобы сломать орехи:

# add consecutive number for equal string
words <- c("book", "ship", "umbrella", "book", "ship", "ship")

# transpose word vector to data.frame for grouping
df <- data.frame(words = words)
df <- df %>% group_by(words) %>% mutate(seqN = row_number())

# combine columns and remove '1' for first occurrence
wordsVec <- paste0(df$words, df$seqN)       
gsub("1", "", wordsVec)
# [1] "book"     "ship"     "umbrella" "book2"    "ship2"    "ship3"   

Есть ли более чистое решение, например, используя пакет stringr?

1 Ответ

1 голос
/ 16 мая 2019

Вы все еще можете использовать row_number() из dplyr, но вам не нужно преобразовывать данные во фрейм данных, т.е.

sub('1$', '', ave(words, words, FUN = function(i) paste0(i, row_number(i))))
#[1] "book"     "ship"     "umbrella" "book2"    "ship2"    "ship3"

Другой вариант - использовать make.unique вместе с gsubfn для увеличения ваших значений на 1, т.е.

library(gsubfn)
gsubfn("\\d+", function(x) as.numeric(x) + 1, make.unique(words))
#[1] "book"     "ship"     "umbrella" "book.2"   "ship.2"   "ship.3"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...