R сделать расчет, если условие с пастой - PullRequest
0 голосов
/ 09 апреля 2020

На самом деле моя проблема в том, что я хочу вычислить значение и вставить его, используя условие if. Я вычисляю значение, которое пропорционально значению в другом столбце. Если условие основано на том факте, что мое значение не должно превышать 5 или быть меньше 5

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

Спасибо

1 Ответ

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

Я думаю, что мы можем использовать ifelse в выражении paste, как показано ниже:

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

Вывод

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...