Проверка условия на двух столбцах и если true, манипулировать 3-м столбцом в R - PullRequest
0 голосов
/ 14 мая 2019

Я искал решение этой проблемы и не смог найти его.Это несколько похоже на другие вопросы, поэтому, если это дубликат, я прошу прощения.

Я хочу проверить два условия на фрейме данных, и когда оба условия будут выполнены, изменить третий столбец.Это может быть легче увидеть на примере:

greetings <- c("Hello", "Howdy", "Hola")

df <- data.frame(
  Criteria_1 = c("Hello", "Hello", "Goodbye", "Goodbye", "Hello"),
  Criteria_2 = c("Yes", "No", "Yes", "No", "Yes"),
  Change_col = c(1,5,6,9,3))

 Criteria_1 Criteria_2 Change_col
1      Hello        Yes          1
2      Hello         No          5
3    Goodbye        Yes          6
4    Goodbye         No          9
5      Hello        Yes          3

Я хотел бы проверить, имеет ли значение Criteria_1 значение в переменной'reeting 'и имеет ли Criteria_2 значение' Yes ​​'.Когда оба значения верны, я бы хотел изменить значение в 'Change_col' на 10.

Это то, что я пробовал, но оно изменяет все значения Change_col на 10.

if(df$Criteria_1 %in% greetings & df$Criteria_2 == 'Yes'){
  df$Change_col <- '10'

Я думаю, что мне, возможно, придется использовать функцию применения?Но не совсем уверен, как это сделать.Желаемый результат будет таким:

  Criteria_1 Criteria_2 Change_col
1      Hello        Yes         10
2      Hello         No          5
3    Goodbye        Yes          6
4    Goodbye         No          9
5      Hello        Yes         10

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Я думаю, dplyr::mutate и оператор ifelse() предлагают хорошее решение.Вы пробовали следующее?

library(tidyverse)

newDf <- df %>%
   mutate(Change_col = ifelse(Criteria_1 %in% greetings & Criteria_2 == "Yes", 10, Change_col))
1 голос
/ 14 мая 2019

Мы можем использовать логическое выражение, чтобы изменить значения в 'Change_col' на 10

df$Change_col[with(df, Criteria_1 %in% greetings & Criteria_2 == "Yes")] <- 10
df
#  Criteria_1 Criteria_2 Change_col
#1      Hello        Yes         10
#2      Hello         No          5
#3    Goodbye        Yes          6
#4    Goodbye         No          9
#5      Hello        Yes         10
...