Обновить значения столбца на основе предопределенных пороговых значений - PullRequest
0 голосов
/ 08 мая 2018

У меня есть набор данных следующим образом

Name    Price
A       100
B       123
C       112
D       114
E       101
F       102

Мне нужен способ обновить значение в столбце цены, если цена находится между +3 или -3 вектора значений, указанного в значение, указанное в векторе. Вектор может содержать любое количество элементов.

Vector = c(100,111)

Обновлен фрейм данных

Name    Price
A       100
B       123
C       111
D       111
E       100
F       100

Если вектор равен

Vector = c(104,122) 

тогда обновленный фрейм данных должен быть

Name    Price
A       100
B       122
C       112
D       114
E       104
F       104

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вот один подход

bound <- 3
upper_bound <- Vector+bound
lower_bound <- Vector-bound
vi <- Reduce("pmax", lapply(seq_along(Vector), function(i) i*(df$Price <= upper_bound[i] & df$Price >= lower_bound[i])))
# [1] 1 0 2 2 1 1
vi_na <- replace(vi, vi == 0, NA)
# [1]  1 NA  2  2  1  1
df$Price <- dplyr::mutate(df, Price = ifelse(is.na(Vector[vi_na]), Price, Vector[vi_na]))

  # Name Price.Name Price.Price
# 1    A          A         100
# 2    B          B         123
# 3    C          C         111
# 4    D          D         111
# 5    E          E         100
# 6    F          F         100

Данные

df <- read.table(text = "Name    Price
A       100
B       123
C       112
D       114
E       101
F       102", header=TRUE)

Vector = c(100,111)   
0 голосов
/ 08 мая 2018
df <- data.frame('Name' = LETTERS[1:6], 'Price'= c(100,123,112,114,101,102))


transform <- function(value, conditionals){

    for(cond in conditionals){
        if(abs(value - cond) < 4){
            return(cond)
        }
     }

    return(value)
}

sapply(df$Price, transform, c(104,122))

Это должно работать. Вероятно, это можно сделать в одной строке с apply (но мне иногда трудно читать, так что это должно быть проще для чтения).

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