Удалить символ и умножить остаток на число в R - PullRequest
0 голосов
/ 26 июня 2018

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

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. </p>

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

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

Ответы [ 2 ]

0 голосов
/ 26 июня 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.

0 голосов
/ 26 июня 2018

Один подход, использующий 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. Если нет, то дайте нам знать, и ответ можно немного изменить.

...