сделать бинарную (наличие / отсутствие) матрицу данных из нескольких списков в r - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть серия отдельных списков переменных (символьных строк) разной длины.Я хочу объединить их в один фрейм данных, чтобы сделать матрицу присутствия (1) / отсутствия (0).Учитывая, что они имеют разную длину, я не могу понять, как даже создать начальный фрейм данных.Вот мой пример:

data1 <- c("a", "b", "c", "d", "e", "f")
data2 <- c("e", "f", "g")
data3 <- c("a", "c", "g")

Мой окончательный результат Я хотел бы создать двоичную матрицу присутствия / отсутствия, как показано ниже, чтобы я мог создать графику (аналогичную тепловой карте) для отображения этого.

   data1     data2    data3
a    1        0         1
b    1        0         0
c    1        0         1   
d    1        0         0
e    1        1         0
f    1        1         0
g    0        1         1

Я все еще новичок в R, так что надеюсь, что мое объяснение в порядке.Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я бы сделал это, используя %in%, который возвращает логический вектор, если значение присутствует или нет.Позже мы используем as.integer для преобразования логического значения в 0 и 1.

# create a master list
master_list <- unique(c(data1, data2, data3))

# make sure each list is as long as master to avoid,
# this error : longer object length is not a multiple of shorter object length
# adding 'll' just a random value
data1 <- c(data1, rep('ll', length(master_list) - length(data1)))
data2 <- c(data2, rep('ll', length(master_list) - length(data2)))
data3 <- c(data3, rep('ll', length(master_list) - length(data3)))

# create output matrix
mat <- matrix(c(as.integer(master_list %in% data1),
            as.integer(master_list %in% data2),
            as.integer(master_list %in% data3)),
            nrow = length(master_list), 
            dimnames = list(master_list))

  [,1] [,2] [,3]
a    1    0    1
b    1    0    0
c    1    0    1
d    1    0    0
e    1    1    0
f    1    1    0
g    0    1    1
0 голосов
/ 02 декабря 2018

В пакете splitstackshape есть вспомогательная функция charMat, которую вы можете попробовать

dat <- paste0("data", 1:3)
out <- t(splitstackshape:::charMat(listOfValues = mget(dat), fill = 0L))
colnames(out) <- dat
out
#  data1 data2 data3
#a     1     0     1
#b     1     0     0
#c     1     0     1
#d     1     0     0
#e     1     1     0
#f     1     1     0
#g     0     1     1

data

data1 <- c("a", "b", "c", "d", "e", "f")
data2 <- c("e", "f", "g")
data3 <- c("a", "c", "g")

объяснение

Функция ожидает list в качестве первого аргумента.Мы можем использовать mget для создания этого списка

mget(dat)
#$data1
#[1] "a" "b" "c" "d" "e" "f"

#$data2
#[1] "e" "f" "g"

#$data3
#[1] "a" "c" "g"

, где dat - это символьный вектор, содержащий имена ваших входных данных

dat
#[1] "data1" "data2" "data3"

t используется длятранспонировать вывод charMat.

Надеюсь, это поможет.

...