создайте новый столбец на основе значения в различных других значениях столбца — с помощью R

#r #dplyr

Вопрос:

 DATA <- data.frame(
  LONDON= c(2,0,1,3,0,1), 
  STOKE = c(45, 40, 6, 22, 16, 10), 
  DERBY = c(5, 9, 8, 9, 2, 3), 
  NEWCASTLE = c(7, 6, 4, 10, 12, 8),
  MANCHESTER = c(2, 12, 1, 7, 8, 3),
  WATFORD = c(9, 2, 4, 6, 13, 6),
  KENT = c(1, 3, 23, 7, 12, 2),
  SURREY = c(2, 8, 4, 5, 1, 4),
  ESSEX = c(4, 12, 7, 9, 5, 1),
  HULL = c(1,3, 2, 4, 3, 1))
 

Я хотел создать столбец «NEW_COL», в котором будет написано «ДА» или «НЕТ» на основе четырех разных столбцов значений. Я хочу, чтобы в новой колонке было «ДА» (в противном случае «НЕТ»), когда ДЕРБИ, НЬЮКАСЛ или СУРРЕЙ > 7 или когда КЕНТ или ХАЛЛ = 2
Я также хочу, чтобы столбец «NEW_COL» был вторым столбцом в моем наборе данных.

Я думал, что что-то вроде этого (ниже) сделало бы это, но этого не произошло. Любая помощь в том, что я здесь делаю не так/как ориентироваться.

 DATA2 <- DATA %>% mutate(NEW_COL = ifelse(rowSums(select(., DERBY:NEWCASTLE) > 7 | select(., SURREY >7)  | select(., KENT == 2) | select(., HULL == 2), na.rm = TRUE), 'Yes', 'No'), .before = 2)
 

Ответ №1:

Мы можем использовать if_any и .before для изменения позиции

 library(dplyr)
DATA <- DATA %>% 
    mutate(NEW_COL = c("NO", "YES")[1   
        (if_any(c(DERBY, NEWCASTLE, SURREY), `>`, 7)|
       if_any(c(KENT, HULL), `==`, 2))], .before = 2)
 

-выход

 DATA
   LONDON NEW_COL STOKE DERBY NEWCASTLE MANCHESTER WATFORD KENT SURREY ESSEX HULL
1      2      NO    45     5         7          2       9    1      2     4    1
2      0     YES    40     9         6         12       2    3      8    12    3
3      1     YES     6     8         4          1       4   23      4     7    2
4      3     YES    22     9        10          7       6    7      5     9    4
5      0     YES    16     2        12          8      13   12      1     5    3
6      1     YES    10     3         8          3       6    2      4     1    1
 

Ответ №2:

Мы могли бы использовать ifelse заявление с вашими условиями

 DATA %>% 
    mutate(NEW_COL = 
               ifelse(DERBY > 7 | NEWCASTLE > 7 | SURREY > 7 |
                             KENT == 2 | HULL == 2, "YES","NO"), .before=2)
 

Выход:

   LONDON NEW_COL STOKE DERBY NEWCASTLE MANCHESTER WATFORD KENT SURREY ESSEX HULL
1      2      NO    45     5         7          2       9    1      2     4    1
2      0     YES    40     9         6         12       2    3      8    12    3
3      1     YES     6     8         4          1       4   23      4     7    2
4      3     YES    22     9        10          7       6    7      5     9    4
5      0     YES    16     2        12          8      13   12      1     5    3
6      1     YES    10     3         8          3       6    2      4     1    1
 

Ответ №3:

Я поклонник этой case_when функции, так как она очень читабельна и легко поддается модификации.

 require(tidyverse)

greater_threshold <- 7
equality_value <- 2

df_new <- DATA %>%
  mutate(NEW_COL = case_when(DERBY > greater_threshold ~ "YES",
                             NEWCASTLE  > greater_threshold ~ "YES",
                             SURREY  > greater_threshold ~ "YES",
                             KENT == equality_value ~ "YES",
                             HULL == equality_value ~ "YES",
                             T ~ "NO"),
         .before = 2)
 

Комментарии:

1. Означает ли это, что на самом деле можно установить 2 разных порога? например, greater_threshold <- 7 и greater_threshold1

2. @lofus77 да, вы можете указать любое количество логических ограничений. Следует иметь в виду, что строка будет оцениваться от первого условия до последнего в установленном вами порядке. Если строка принимает значение true, ни одно из следующих условий проверяться не будет, ей будет присвоено значение, следующее за тильдой. В моем примере, если установлено, что значение Derby превышает пороговое значение 7, ни одна из других оценок не выполняется, строке присваивается переменная «ДА» в поле NEW_COL.

Ответ №4:

Ваша rowSums попытка была близка. Вы можете сделать —

 library(dplyr)

DATA %>% 
  mutate(NEW_COL = ifelse(rowSums(select(., DERBY, NEWCASTLE, SURREY) > 7) > 0 | 
                          rowSums(select(., KENT, HULL) == 2) > 0, 'Yes', 'No'), .before = 2)

#  LONDON NEW_COL STOKE DERBY NEWCASTLE MANCHESTER WATFORD KENT SURREY ESSEX HULL
#1      2      No    45     5         7          2       9    1      2     4    1
#2      0     Yes    40     9         6         12       2    3      8    12    3
#3      1     Yes     6     8         4          1       4   23      4     7    2
#4      3     Yes    22     9        10          7       6    7      5     9    4
#5      0     Yes    16     2        12          8      13   12      1     5    3
#6      1     Yes    10     3         8          3       6    2      4     1    1