Создать фиктивный столбец на основе других столбцов - PullRequest
0 голосов
/ 27 апреля 2018

Допустим, у меня есть этот набор данных

> example <- data.frame(a = 1:10, b = 10:1, c = 1:5 )

Я хочу создать новую переменную d. Я хочу в d значение 1, когда хотя бы в переменной a b c присутствует значение 1, 2 или 3. d должно выглядеть так:

d <- c(1, 1, 1, 0, 0, 1, 1, 1, 1, 1)

Заранее спасибо.

Ответы [ 7 ]

0 голосов
/ 27 апреля 2018

С пакетом dplyr:

library(dplyr)
x <- 1:3
example %>% mutate(d = as.integer(a %in% x | b %in% x | c %in% x))
0 голосов
/ 27 апреля 2018

общее решение:

example %>%
sapply(function(i)i %in% x) %>% apply(1,any) %>% as.integer
#[1] 1 1 1 0 0 1 1 1 1 1
0 голосов
/ 27 апреля 2018

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

#option 1
example$d <- +(rowSums(sapply(example, `%in%`, 1:3)) > 0)

#option 2
library(matrixStats)
example$d <- rowMaxs(+(sapply(example, `%in%`, 1:3)))

которые оба дают:

> example
    a  b c d
1   1 10 1 1
2   2  9 2 1
3   3  8 3 1
4   4  7 4 0
5   5  6 5 0
6   6  5 1 1
7   7  4 2 1
8   8  3 3 1
9   9  2 4 1
10 10  1 5 1
0 голосов
/ 27 апреля 2018

Подойдет для любого количества переменных:

example <- data.frame(a = 1:10, b = 10:1, c = 1:5 )
x <- c(1, 2, 3)
as.integer(Reduce(function(a, b) (a %in% x) | (b %in% x), example))
0 голосов
/ 27 апреля 2018

Попробуйте этот метод, проверьте, есть ли в каком-либо столбце в списке один элемент, присутствующий в x.

x<-c(1,2,3)
example$d<-as.numeric(example$a %in% x | example$b %in% x | example$c %in% x)
example
    a  b c d
1   1 10 1 1
2   2  9 2 1
3   3  8 3 1
4   4  7 4 0
5   5  6 5 0
6   6  5 1 1
7   7  4 2 1
8   8  3 3 1
9   9  2 4 1
10 10  1 5 1
0 голосов
/ 27 апреля 2018

Вы можете использовать rowSums, чтобы получить логический вектор 1, 2 or 3, появляющийся в каждой строке, и обернуть его в as.integer для преобразования в 0 и 1, то есть

as.integer(rowSums(df == 1|df == 2| df == 3) > 0)
#[1] 1 1 1 0 0 1 1 1 1 1
0 голосов
/ 27 апреля 2018

Вы можете сделать это с помощью apply (хотя и немного медленно)

Логика : any будет сравнивать, присутствует ли 1,2 или 3 или нет, apply используется для итерации этой логики в каждой из строк. Затем, наконец, преобразовав логический результат в числовое, добавив +0 (здесь вы можете выбрать as.numeric на случай, если вы хотите быть более выразительным)

d <- apply(example,1 ,function(x)any(x==1|x==2|x==3))+0

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

d <- apply(example[,c("a","b","c")], 1, function(x)any(x==1|x==2|x==3))+0

Здесь у вас есть контроль над столбцами, по которым можно принимать или игнорировать ваши потребности.

выход

> d
 [1] 1 1 1 0 0 1 1 1 1 1
...