Присвоение категогических значений нескольким переменным в r

Скажем, у меня есть следующий ввод данных в R

x <- c(1,1,0,0,0,0)
y <- c(1,0,1,0,0,0)
z <- c(0,0,0,0,1,1)
p <- c(0,0,0,1,1,0)

data <- data.frame(x,y,z,p)

Теперь я хочу ввести новую переменную в данных под названием "кошка"

в рамках cat я хочу присвоить значения "a" любому наблюдению, где 1 появляется в виде x или y o появляется в обоих. Я хочу назначить значение 'b' для наблюдений, где 1 появляется в одном или обоих z и p.

2 ответа

Решение
c("b", "a")[(!!rowSums(data[,1:2])) +0 + (!!rowSums(data[,3:4])+1)]
#[1] "a" "a" "a" "b" "b" "b"
  • Предполагая, что я понимаю условие, а также предполагая, что не будет никаких пересекающихся случаев, то есть строк одного или обоих x, y которые 1 не имеет пересечения с z или же p имеющий 1 ценности
  • В качестве первого шага я сделал rowSums на колоннах x а также y

    rowSums(data[,1:2])
    #[1] 2 1 1 0 0 0
    
  • Двойное отрицание на приведенный выше результат и добавление 0 дает

    (!!rowSums(data[,1:2]))+0
     #[1] 1 1 1 0 0 0
    
  • То же самое применительно к столбцам z а также p но я добавляю 1 дает

    (!!rowSums(data[,3:4]))+1
    #[1] 1 1 1 2 2 2
    
  • Если добавить два приведенных выше результата, получим

    (!!rowSums(data[,1:2])) +0 + (!!rowSums(data[,3:4])+1)
     #[1] 2 2 2 1 1 1
    
  • Это может быть использовано в качестве числового индекса, так что если я использую c("b", "a")[!!rowSums..], 2 значения будут заменены b а также 1 с a,

Эта строка возвращает "а", если либо x или же y не равен нулю, а "b" в противном случае.

ifelse(data$x | data$y, "a", "b")
# [1] "a" "a" "a" "b" "b" "b"

Если вам нужно обработать случай, когда все четыре столбца равны нулю, вы можете использовать:

ifelse(data$x | data$y,
       "a",
       ifelse(data$z | data$p, "b", "neither a nor b"))
Другие вопросы по тегам