Mám súbor údajov takto
Name Price
A 100
B 123
C 112
D 114
E 101
F 102
Potrebujem spôsob, ako aktualizovať hodnotu v cenestĺpec, ak je cena medzi +3 alebo -3 vektora hodnôt zadaných k hodnote špecifikovanej vo vektore. Vektor môže obsahovať ľubovoľný počet prvkov.
Vector = c(100,111)
Aktualizovaný dataframe
Name Price
A 100
B 123
C 111
D 111
E 100
F 100
Ak je vektor
Vector = c(104,122)
potom musí byť aktualizovaný údajový rámec
Name Price
A 100
B 122
C 112
D 114
E 104
F 104
odpovede:
2 pre odpoveď č. 1df <- 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))
Toto by malo fungovať. Pravdepodobne sa to dá urobiť v jednom riadku s aplikáciou (ale je pre mňa ťažké prečítať si niekedy, takže by to malo byť ľahšie čitateľné).
2 pre odpoveď č. 2
Tu je jeden prístup
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
údaje
df <- read.table(text = "Name Price
A 100
B 123
C 112
D 114
E 101
F 102", header=TRUE)
Vector = c(100,111)