Создать новый столбец на основе нескольких условий

#r #data-manipulation #recode

#r #манипулирование данными #перекодировать

Вопрос:

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

 a <- data.frame(x=c(1,0,1,0,0), y=c(0,0,0,0,0), z=c(1,1,0,0,0))
a
  x y z
1 1 0 1
2 0 0 1
3 1 0 0
4 0 0 0
5 0 0 0
 

В частности, если для какой-либо конкретной строки присутствует 1, то новый столбец возвращает 1. Если все равно 0, то новый столбец возвращает 0. Таким образом, набор данных с новым столбцом будет

   x y z w
1 1 0 1 1
2 0 0 1 1
3 1 0 0 1
4 0 0 0 0
5 0 0 0 0
 

Моей первоначальной мыслью было использовать %in% , но я не смог получить желаемый результат. Спасибо за вашу помощь!

Ответ №1:

Если ваш фрейм данных состоит из двоичных значений, например, только 0 и 1 , вы можете попробовать приведенный ниже код с помощью rowSums

 a$w <-  (rowSums(a)>0)
 

такой, что

 > a
  x y z w
1 1 0 1 1
2 0 0 1 1
3 1 0 0 1
4 0 0 0 0
5 0 0 0 0
 

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

1. Элегантно! Спасибо! Просто любопытно, что, если данные не являются двоичными? Например, если строка содержит значения только от 1 до 5, перекодируйте значение в 1, а если оно содержит какие-либо другие значения, перекодируйте в 2.

2. @cliu Затем вы можете попробовать 2-(a >= 1) * (a <= 5) перекодировать

Ответ №2:

Мы можем использовать rowMaxs из matrixStats

 library(matrixStats)
a$w <- rowMaxs(as.matrix(a))
a$w
#[1] 1 1 1 0 0
 

Ответ №3:

Вы можете найти max из каждой строки :

 a$w <- do.call(pmax, a)
a

#  x y z w
#1 1 0 1 1
#2 0 0 1 1
#3 1 0 0 1
#4 0 0 0 0
#5 0 0 0 0
 

что также можно сделать с помощью apply :

 a$w <- apply(a, 1, max)