устранение непрерывных значений - PullRequest
0 голосов
/ 12 сентября 2018
Des          Price                                New column 

a   27.82 / 27.82 / 23.65 / 27.82                   27.82 / 23.65 / 27.82

b   19.87 / 19.87 / 19.14 / 19.87                   19.87 / 19.14 / 19.87

c   32.25 / 32.25 / 31 / 32.25 / 31                 32.25 / 31 / 32.25 / 31

d   79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39   79.39 / 83.36 / 79.39

У меня есть столбец цен.Мне нужен только новый столбец, исключающий непрерывные повторяющиеся значения.Пожалуйста, предложите.В первом ряду, так как 27,82 непрерывно повторяется, его следует сделать равным 1, а выход должен быть 27,82 / 23,65 / 27,82

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Здесь немного другой подход, использующий tidyverse:

Данные

vect <- c('27.82 / 27.82 / 23.65 / 27.82',
          '19.87 / 19.87 / 19.14 / 19.87',
          '32.25 / 32.25 / 31 / 32.25 / 31',
          '79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39')

Код

library(tidyverse)
vect %>% 
  str_split( ' / ') %>% 
  map(~.x[.x!=lag(.x) | is.na(lag(.x))]) %>% 
  map_chr(paste, collapse=' / ')

Вывод

[1] "27.82 / 23.65 / 27.82"   "19.87 / 19.14 / 19.87"   
[3] "32.25 / 31 / 32.25 / 31" "79.39 / 83.36 / 79.39"
0 голосов
/ 13 сентября 2018

Данные: data <-data.frame (Des = c ("a", "b", "c", "d"), цена = c ('27,82 / 27,82 / 23,65 / 27,82 ', '19,87 / 19,87 / 19,14 / 19,87) ',' 32,25 / 32,25 / 31 / 32,25 / 32,25 ',' 79,39 / 79,39 / 79,39 / 79,39 / 83,36 / 79,39 ')) </p>

  Des                                         price
1   a                 27.82 / 27.82 / 23.65 / 27.82
2   b                 19.87 / 19.87 / 19.14 / 19.87
3   c            32.25 / 32.25 / 31 / 32.25 / 31
4   d 79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39

Код:

data$`New Column`<-gsub("\\b([\\w\\.]+)( / \\1\\b)+","\\1",data$price,perl = T)

Итог:

Des                                         price            New Column
1   a                 27.82 / 27.82 / 23.65 / 27.82   27.82 / 23.65 / 27.82
2   b                 19.87 / 19.87 / 19.14 / 19.87   19.87 / 19.14 / 19.87
3   c               32.25 / 32.25 / 31 / 32.25 / 31   32.25 / 31 / 32.25 / 31
4   d 79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39   79.39 / 83.36 / 79.39
0 голосов
/ 12 сентября 2018
test=c("27.82 / 27.82 / 23.65 / 27.82","19.87 / 19.87 / 19.14 / 19.87","32.25 / 32.25 / 31 / 32.25 / 31","79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39")
unlist(lapply(strsplit(test," / "),function(x) paste(rle(x)$values,collapse=" / ")))

По сути, я построил ваш вектор цен в test. Что происходит здесь:

  1. Я делю каждую строку вашего вектора из 1 столбца на его части с помощью strsplit.
  2. Для каждого из этих элементов я проверяю наличие повторяющихся смежных элементов (например, Unix uniq), используя rle, который генерирует список с элементом с именем values, в котором хранятся уникальные значения.
  3. I paste все эти значения с paste, опция свертывания используется для установки разделителя на тот же, который использовался ранее.
  4. Поскольку это сгенерировало список, я unlist создаю столбец.

Выход:

> unlist(lapply(strsplit(test," / "),function(x) paste(rle(x)$values,collapse=" / ")))
[1] "27.82 / 23.65 / 27.82"   "19.87 / 19.14 / 19.87"   "32.25 / 31 / 32.25 / 31" "79.39 / 83.36 / 79.39"  

Кстати, в следующий раз было бы лучше, если бы вы предоставили сообществу воспроизводимый пример (таким образом, читатели не должны сами записывать ваши данные в объект), а также покажите, что вы уже пробовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...