Использование множественного if если еще при построении диаграммы рассеяния, определенной цветом - PullRequest
2 голосов
/ 28 сентября 2019

У меня есть простой фрейм данных с тремя столбцами.Последние содержат числа от 1 до 7. Я пытаюсь построить простой точечный график из двух первых столбцов и закрасить точки на основе значения последнего столбца.

a <- c(rep(1,17))
b <- c(rep(2,13))
c <- c(rep(1,8))
d <- c(rep(3,4))
e <- c(rep(2,13))
f <- c(rep(4,6))
g <- c(rep(3,13))
h <- c(rep(1,6))
i <- c(rep(3,10))
j <- c(rep(4,5))
k <- c(rep(5,26))
l <- c(rep(6,8))
m <- c(rep(7,9))
n <-  c(rep(3,3))
o <-  c(rep(7,10))
p <-  c(rep(6,6))
q <-  c(rep(1,1))
r <-  c(rep(7,8))

factor_column <- append(a,b) 
factor_column <- append(factor_column,c)
factor_column <- append(factor_column,d)
factor_column <- append(factor_column,e)
factor_column <- append(factor_column,f)
factor_column <- append(factor_column,g)
factor_column <- append(factor_column,h)
factor_column <- append(factor_column,i)
factor_column <- append(factor_column,j)
factor_column <- append(factor_column,k)
factor_column <- append(factor_column,l)
factor_column <- append(factor_column,m)
factor_column <- append(factor_column,n)
factor_column <- append(factor_column,o)
factor_column <- append(factor_column,p)
factor_column <- append(factor_column,q)
factor_column <- append(factor_column,r)

x1 <- c((1:166))
x2 <- c((166:331))
df <- data_frame(x1=x1, x2=x2,factor_column=factor_column)


Я пробовал что-то вроде этого

col_f <- if (df$factor_column=1) {
  col = "red"
  } else if (df$factor_column=2) {
  col= "blue"
  }else if (df$factor_column=3) {
  col="yellow"
  }else if (df$factor_column=4) {
  col="black"
  }else if (df$factor_column=5) {
  col="pink"
  }else if (df$factor_column=6) {
  col="green"
  }else {col="gray"}

plot(df$x1,df$x2, col=col_f)

Но на самом деле это не работает.

Ответы [ 2 ]

3 голосов
/ 28 сентября 2019

Вот простое векторизованное базовое решение R.

cols <- c("red", "blue", "yellow", "black", "pink", "green", "gray")
df$col <- cols[ifelse(df$factor_column < 7, df$factor_column, 7)]

Примечание: Я сравнил этот результат с первым результатом в ответе Акруна иони identical().

3 голосов
/ 28 сентября 2019

Вместо нескольких if/else или ifelse или case_when (что было бы более правильным вместо if/else, поскольку ifelse и case_when векторизованы, тогда как if/else ожидает вектор с length 1- поэтому нужно циклически перебирать строки вместо целого столбца) создать набор данных 'key / val' и выполнить объединение один раз

library(dplyr)
keyvaldat <- data.frame(factor_column  = 1:6, col = c("red", "blue", "yellow", 
  "black", "pink", "green"), stringsAsFactors = FALSE)

left_join(df, keyvaldat)  %>%
       mutate(col = replace(col, is.na(col), "gray"))
# A tibble: 166 x 4
#      x1    x2 factor_column col  
#   <int> <int>         <dbl> <chr>
# 1     1   166             1 red  
# 2     2   167             1 red  
# 3     3   168             1 red  
# 4     4   169             1 red  
# 5     5   170             1 red  
# 6     6   171             1 red  
# 7     7   172             1 red  
# 8     8   173             1 red  
# 9     9   174             1 red  
#10    10   175             1 red  
# … with 156 more rows

Есть несколько способов сделать это, другой вариант сcase_when.Обратите внимание, что с количеством элементов, которые нужно изменить, число операторов также увеличивается

df %>%
    mutate(col = case_when(factor_column == 1 ~ "red", 
                           factor_column == 2 ~ "blue", 
                           factor_column == 3 ~ "yellow", 
                           factor_column ==4 ~ "black",
                           factor_column == 5 ~ "pink", 
                           factor_column == 6~ "green", 
                       TRUE ~ "gray"))

Или с recode

df %>% 
  mutate(col = recode(factor_column, '1' = 'red', '2' = 'blue', 
             '3' = 'yellow', '4' = 'black', '5' = 'pink', 
             '6' = 'green', .default= 'gray')) 

Или с использованием именованного вектора

df$col <- setNames(c("red", "blue", "yellow", 
   "black", "pink", "green"), 1:6)[as.character(df$factor_column)]
df$col[is.na(df$col)] <- "gray"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...