R результат расчета не превышает порог - PullRequest
0 голосов
/ 09 апреля 2020

Возможно, это глупый вопрос, но я не могу найти решение

Я делаю расчет и не хочу, чтобы результат превышал максимальное значение

Допустим, я не не хотите, чтобы значение было больше 15

10+10= if( > 15) {15}

Каков правильный синтаксис этого, пожалуйста?

На самом деле моя проблема заключается в том, что я хочу вычислить значение и вставить его, используя условие if

r=0
g=0
b=0
activity_rgb_2=data.frame(activity=seq(from=-6,to = 6,by = 1))%>%
mutate(
  rgb=ifelse(activity<0,
             paste(r=-255*(activity)/5
                   if (r>255){r=255},0,0,sep = ","),paste(0,b=255*(activity)/5
                                                          if (b>255){r=255},0,sep = ",")))

Я ожидаю что-то подобное:

activity_rgb
   activity     rgb
1        -6 255,0,0
2        -5 255,0,0
3        -4 204,0,0
4        -3 153,0,0
5        -2 102,0,0
6        -1  51,0,0
7         0   0,0,0
8         1  0,51,0
9         2 0,102,0
10        3 0,153,0
11        4 0,204,0
12        5 0,255,0
13        6 0,255,0 

Я пытался сделать это, используя также функцию

    scale_to_rgb <- function(val, colors = c("#ff0000","#000000", "#00ff00"), format = c("rgb", "comma")) {
      format = match.arg(format)
      val <- (val - min(val, na.rm = TRUE)) / diff(range(val, na.rm = TRUE))
      cols <- colorRamp(colors)(val)
      if (format == "rgb") {
        cols <- cols / 255
        rgb(cols[,1], cols[,2], cols[,3])
      } else {
        cols <- round(cols, 0)
        paste(cols[,1], cols[,2], cols[,3], sep = ",")
      }
    }

activity_rgb=data.frame(activity=seq(from=-4,to = 6,by = 1))%>%
  mutate(
    fake_activity = pmax(-5, pmin(activity,5)),
    palette = scale_to_rgb(fake_activity), # can be switch off
    rgb = scale_to_rgb(fake_activity, format = "comma") )

Но проблема в том, что я получил 255, 0,0 для значения активности = -4 вместо 204,0,0

activity_rgb
   activity fake_activity palette     rgb
1        -4            -4 #FF0000 255,0,0
2        -3            -3 #C60000 198,0,0
3        -2            -2 #8E0000 142,0,0
4        -1            -1 #550000  85,0,0
5         0             0 #1C0000  28,0,0
6         1             1 #001C00  0,28,0
7         2             2 #005500  0,85,0
8         3             3 #008E00 0,142,0
9         4             4 #00C600 0,198,0
10        5             5 #00FF00 0,255,0
11        6             5 #00FF00 0,255,0

Что я ожидаю в этом случае получить:

activity_rgb
   activity fake_activity palette     rgb
1        -4            -4 #FF0000 204,0,0
2        -3            -3 #C60000 153,0,0
3        -2            -2 #8E0000 102,0,0
4        -1            -1 #550000  51,0,0
5         0             0 #1C0000  0,0,0
6         1             1 #001C00  0,51,0
7         2             2 #005500  0,102,0
8         3             3 #008E00 0,153,0
9         4             4 #00C600 0,204,0
10        5             5 #00FF00 0,255,0
11        6             5 #00FF00 0,255,0

Спасибо

Ответы [ 2 ]

4 голосов
/ 09 апреля 2020

Вы можете использовать min или pmin в зависимости от вашего типа ввода.

Для скалярного ввода:

min(5, 15)
#[1] 5
min(20, 15)
#[1] 15

Для векторного ввода:

pmin(11:17, 15)
#[1] 11 12 13 14 15 15 15
1 голос
/ 09 апреля 2020

с использованием ifelse()

x <- 1:20     

ifelse(x > 15, 15, x)
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 15 15 15 15 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...