首页 > 解决方案 > 根据条件使用来自另一个向量的值更改列中的值

问题描述

想象一下我有这个df。

library(dplyr)
library(scales)
df <- data.frame("item" = 1:10, "quantity" = c(21,15,12,14,26,12,13,15,24,26), "value" = c(90,110,105,102,86,112,75,84,34,99))

理想情况下,我想将值最大化为 100。因此,我想取任何值高于 95 的项目,然后在 1:5 范围内缩放它们。然后我想在 95 之上添加缩放值以获得 95 到 100 之间的值。这是我目前拥有的:

x <- df[df$value >= 95,]
x <- x$value
x <- rescale(x, to = c(0,5))
x  # [1] 4.23, 2.31, 1.15, 5.00, 0.00
df <- df %>% mutate(value = ifelse(value >= 95, 95 + x, value))

如您所想,这给了我95+x[1]所有高于 95 的值。我想我需要一个 for 循环,但不太清楚如何构造它。谢谢。

所需的输出将是:

Item Quantity Value
1       21    90 
2       15    99.23
3       12    97.31
4       14    96.15
5       26    86 
6       12    100
7       13    75 
8       15    84
9       24    34 
10      26    95

标签: rdataframedplyrdata-manipulation

解决方案


我不确定这是否是您正在寻找的,但使用 dplyr 和 scales 包:

df %>% 
 mutate(Value = ifelse(Value >= 95, 95 + scales::rescale(Value, to = c(1, 5)), Value))

编辑:

df %>% 
  filter(Value >= 95) %>% 
  mutate(Value = 95 + scales::rescale(Value, to = c(0, 5))) %>% 
  bind_rows(filter(df, Value < 95)) %>% 
  arrange(Item)

推荐阅读