Условная замена нуля на единицу и единицы на ноль

#r #conditional-statements

#r #условные операторы

Вопрос:

У меня есть набор данных, в котором мне нужно изменить значение ноль на единицу и один на ноль в одном столбце, в зависимости от другого столбца.

Например:

 structure(list(id = c(2007, 2007, 2007, 2008, 2008, 2008, 2009, 
2009, 2009, 2010, 2010), var = c(0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 
0)), class = "data.frame", row.names = c(NA, -11L))
 

Внесение изменений только для 2008 и 2010 годов:

 structure(list(id = c(2007, 2007, 2007, 2008, 2008, 2008, 2009, 
2009, 2009, 2010, 2010), var = c(0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 
1)), row.names = c(NA, -11L), class = "data.frame")
 

Любая помощь будет приветствоваться. Спасибо.

Ответ №1:

Если x является двоичным (1s и 0s), то 1 - x переключает 1s и 0s. Поэтому мы используем 1 - x для строк, которые вы хотите изменить:

 rows = df$id %in% c(2008, 2010)
df$var[rows] = 1 - df$var[rows]
df
#      id var
# 1  2007   0
# 2  2007   1
# 3  2007   0
# 4  2008   1
# 5  2008   0
# 6  2008   0
# 7  2009   1
# 8  2009   0
# 9  2009   1
# 10 2010   1
# 11 2010   1
 

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

1. Отлично @Грегор Томас, очень благодарен.

Ответ №2:

Может быть, немного взломать, но просто возьмите абсолютное значение var минус 1

 a <- structure(list(id = c(2007, 2007, 2007, 2008, 2008, 2008, 2009, 
2009, 2009, 2010, 2010), var = c(0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 
0)), class = "data.frame", row.names = c(NA, -11L))

a$var <- abs(a$var-1)
 

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

1. Если вы просто хотите изменить определенные строки, вы можете использовать обозначение в скобках a$var[a$id==2008|a$id==2010] <- abs(a$var[a$id==2008|a$id==2010]-1)