Как сделать двоичную матрицу, сравнивая несколько столбцов - PullRequest
0 голосов
/ 22 января 2020

Я новичок в программировании и R.

У меня есть такие данные в столбцах:

C1        C2     C3        C4          C5
Apple            Apple     Banana      Banana
Banana           Orange    Orange
Orange

Я хочу создать двоичную матрицу, сравнивающую все столбцы с C1, где 1 - ИСТИНА, а 0 - ЛОЖЬ. Я хочу что-то вроде этого:

 C1        C2     C3        C4          C5
Apple      0      1         0           0
Banana     0      0         1           1
Orange     0      1         1           0

Кто-нибудь знает, как это сделать? Спасибо.

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Вы можете l oop над C2-C4 и сопоставить элементы с C1, т.е.

(!is.na(sapply(dd[-1], function(i)match(dd$C1, i))))*1

#     C2 C3 C4 C5
#[1,]  0  1  0  0
#[2,]  0  0  1  1
#[3,]  0  1  1  0

Или связать их вместе с C1, то есть

cbind.data.frame(C1 = dd$C1, (!is.na(sapply(dd[-1], function(i) match(dd$C1, i)))) * 1)

#      C1 C2 C3 C4 C5
#1  Apple  0  1  0  0
#2 Banana  0  0  1  1
#3 Orange  0  1  1  0
1 голос
/ 22 января 2020

Мы можем использовать %in%:

df[-1] <- +(sapply(df[-1], `%in%`, x = df$C1))
df

#      C1 C2 C3 C4 C5
#1  Apple  0  1  0  0
#2 Banana  0  0  1  1
#3 Orange  0  1  1  0

данные

df <- structure(list(C1 = structure(1:3, .Label = c("Apple", "Banana", 
"Orange"), class = "factor"), C2 = c(NA, NA, NA), C3 = structure(c(1L, 
2L, NA), .Label = c("Apple", "Orange"), class = "factor"), C4 = structure(c(1L, 
2L, NA), .Label = c("Banana", "Orange"), class = "factor"), C5 = structure(c(1L, 
NA, NA), .Label = "Banana", class = "factor")), class = "data.frame",
row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...