#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