Удалить символ и умножить остаток на число в R

У меня есть простой фрейм данных:

Date <- seq(as.Date("2013/1/1"), by = "day", length.out = 12)

test < -data.frame(Date)

test$Value <- c("1,4","2,3","3,6","< 1,4","2,3","3,6","1,4","2,3","3,6","< 1,4","2,3","3,6")

Мне нужно пройтись по каждой строке и удалить знак «‹ », если он обнаружен. Затем мне нужно умножить оставшееся число на 5.

Я пробовал использовать gsub (), но это позволяет мне заменять только один символ другим символом или пробелом, но не позволяет мне выполнять вычисления. Думаю, мне также нужно изменить десятичный разделитель с «на». чтобы иметь возможность использовать эти числа как числа.

Как я могу решить эту проблему в R?


person Matt    schedule 26.06.2018    source источник
comment
Взять str_replace из пакета stringr. Затем вам нужно будет преобразовать столбец в числовой.   -  person Ben G    schedule 26.06.2018


Ответы (2)


Один из подходов с использованием sub заключался бы в сопоставлении со следующим шаблоном:

(?:<\s*)?(\d+),(\d+)

(?:<\s*)?   match a < followed by any amount of whitespace, the
            entire quantity either zero or one time
(\d+)       match and capture one or more digits before the comma
,           match the comma separator
(\d+)       match and capture one or more digits after the comma

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

Затем мы можем сформировать маску умножения со значением 0/1, при этом тем записям, которым < присваивается 1.

mask <- grepl("<", test$Value)
test$Value <- as.numeric(sub("(?:<\\s*)?(\\d+),(\\d+)", "\\1.\\2", test$Value))
test$Value <- test$Value + (4*mask*test$Value)
test$Value

[1] 1.4 2.3 3.6 7.0 2.3 3.6 1.4 2.3 3.6 7.0 2.3 3.6

Демо

Примечание. Я предполагаю, что вы хотите умножить каждое число на 5. Если нет, то сообщите нам, и ответ можно немного изменить.

person Tim Biegeleisen    schedule 26.06.2018
comment
Мне нужно умножить на 5 только те числа, где стоит знак ‹. - person Matt; 26.06.2018
comment
@ Мэтт Я исправил. В вашем первоначальном вопросе не было ясности об этом требовании. - person Tim Biegeleisen; 26.06.2018
comment
Это сработало. Однако где в вашем примере умножение на 5? Просто для понимания того, что ты сделал. - person Matt; 26.06.2018
comment
Если мы начнем с одной единицы Value, чтобы получить в пять раз больше единицы, нам нужно добавить еще 4 единицы. - person Tim Biegeleisen; 26.06.2018
comment
Что, если мне нужно разделить эти конкретные значения на 2 вместо умножения на 5? - person Matt; 26.06.2018
comment
@ Тим, почему бы просто не test$Value[mask] <- test$Value[mask] * 5 - person Andre Elrico; 26.06.2018
comment
В этом случае вы можете открыть новый вопрос :-) - person Tim Biegeleisen; 26.06.2018
comment
@Matt, если вы сделаете это как 2 комментария выше, вы можете просто заменить * 5 на / 5 - person Andre Elrico; 26.06.2018
comment
@TimBiegeleisen Где я могу получить дополнительную информацию о выражениях, которые вы использовали в тесте $ Value ‹- as.numeric (sub ((?:‹ \\ s *)? (\\ d +), (\\ d +), \\ 1 . \\ 2, test $ Value))? Нет подробной информации при использовании? Sub () в R. - person Matt; 26.06.2018
comment
@Matt Я бы рекомендовал просто просмотреть любой вводный учебник по регулярным выражениям. Я не могу полностью объяснить закономерность в комментарии. - person Tim Biegeleisen; 26.06.2018
comment
@Matt stringr шпаргалка - действительно хороший пример для этого: google.com/ - person Ben G; 26.06.2018

Вот решение с использованием tidyverse

library(tidyverse) #load necessary packages

data <- tibble(value = c("2,3", "< 2,5", "3,5")) %>%
  mutate(value_modified = str_replace(value, ",", "\\."),  # replace the comma with a period
         value_modified = str_extract(value_modified, "[:digit:]\\.[:digit:]"), # extract the relevant characters
         value_modified = as.numeric(value_modified), # convert to numeric
         value_modified = if_else(str_detect(value, "<"), value_modified * 5, value_modified)) # multiply by five if < symbol is in the original data

Я считаю, что решения, использующие tidyverse, упрощают понимание.

person Ben G    schedule 26.06.2018
comment
Когда я копирую и вставляю его в R Studio, он по-прежнему сигнализирует о незавершенной функции - person Wiktor Stribiżew; 26.06.2018
comment
Ошибка в mutate_impl (.data, точки): ошибка оценки: неиспользуемые аргументы (измененное_значение * 5, измененное_значение). - person Wiktor Stribiżew; 26.06.2018
comment
Давайте продолжим это обсуждение в чате. - person Ben G; 26.06.2018