#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)