Как соединить векторный элемент с предыдущими в соответствии с условием - PullRequest
4 голосов
/ 25 июня 2019

Я получаю данные из веб-источника с rvest, а затем я получил вектор, скажем x, длина которого отличается от других моих векторов (поэтому я не могу объединить их в таблицу). Приступая к делу: причина в том, что каждый раз, когда я вижу элемент 'nuovo' (позиция x[11]) в vec, я знаю, что он должен быть вставлен точно с предыдущим, тогда я также должен отменить элемент 'nuovo' потому что мне нужен вектор длины 25

x  = c("Vetrina" ,"Vetrina" ,"Vetrina",
"Vetrina" ,"Vetrina", "Vetrina",
"Vetrina" ,"Vetrina" ,"Vetrina",
"Vetrina" ,"nuovo" ,"Vetrina",
"Vetrina" ,"Vetrina" ,"Vetrina",
"Vetrina" ,"Vetrina" ,"Vetrina",
"Vetrina" ,"Vetrina", "Vetrina",
"Vetrina" ,"Vetrina", "Vetrina",
"Vetrina" ,"Vetrina")

length(x) = 26

и тогда мне нужно x чтобы быть похожим на:

x  = c("Vetrina" ,"Vetrina" ,"Vetrina",
"Vetrina" ,"Vetrina", "Vetrina",
"Vetrina" ,"Vetrina" ,"Vetrina",
"Vetrina nuovo","Vetrina",
"Vetrina" ,"Vetrina" ,"Vetrina",
"Vetrina" ,"Vetrina" ,"Vetrina",
"Vetrina" ,"Vetrina", "Vetrina",
"Vetrina" ,"Vetrina", "Vetrina",
"Vetrina" ,"Vetrina")

length(x) = 25

Ответы [ 3 ]

3 голосов
/ 25 июня 2019

Вот решение в base R. Сначала вы получаете позицию nuovo, затем paste в предыдущую позицию. Наконец вы удаляете nuovo позиции.

x <- c("Vetrina" ,"Vetrina" ,"Vetrina",
       "Vetrina" ,"Vetrina", "Vetrina",
       "Vetrina" ,"Vetrina" ,"Vetrina",
       "Vetrina" ,"nuovo" ,"Vetrina",
       "Vetrina" ,"Vetrina" ,"Vetrina",
       "Vetrina" ,"Vetrina" ,"Vetrina",
       "Vetrina" ,"Vetrina", "Vetrina",
       "Vetrina" ,"Vetrina", "Vetrina",
       "Vetrina" ,"nuovo")

pos <- x == "nuovo"
x[c(pos[-1], F)] <- paste(x[c(pos[-1], F)], "nuovo")
x <- x[!pos]

length(x)
> 24
3 голосов
/ 25 июня 2019

Вы можете использовать это:

# First find the elements we wish to remove
nuovo = which(x=="nuovo")
x = x[-nuovo]

# Now paste into the preceding elements.
nuovo2 = nuovo - seq_along(nuovo)
x[nuovo2] = paste(x[nuovo2], "nuovo")

Аналогично, вы можете вместо этого изменить порядок этих операций и вставить перед удалением

x[nuovo - 1] = paste(x[nuovo - 1], "nuovo")
x = x[-nuovo]
2 голосов
/ 25 июня 2019

Одна возможность с участием lag() из dplyr():

x <- ifelse(lag(x, default = first(x)) == "nuovo", paste(x, lag(x)), x)
x[-grepl("nuovo", x)]

 [1] "Vetrina"       "Vetrina"       "Vetrina"       "Vetrina"       "Vetrina"      
 [6] "Vetrina"       "Vetrina"       "Vetrina"       "Vetrina nuovo" "Vetrina"      
[11] "Vetrina"       "Vetrina"       "Vetrina"       "Vetrina"       "Vetrina"      
[16] "Vetrina"       "Vetrina"       "Vetrina"       "Vetrina"       "Vetrina"      
[21] "Vetrina"       "Vetrina"       "Vetrina"       "Vetrina"  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...