Создайте сравнительную таблицу из df в R - PullRequest
1 голос
/ 20 апреля 2020

У меня есть фрейм данных с набором имен генов в виде строк и характеристик генов в виде столбцов. Моя идея состоит в том, чтобы создать сравнительную таблицу с логическими значениями, указывающими, соответствуют ли они одному или нескольким признакам.

В качестве примера я создаю следующее, воссоздающее ожидаемый результат

Сначала я создаю здесь список личных характеристик с именами людей. В моих реальных данных они являются характеристиками генов с именами генов в них.

Gentle <- as.character(c("Jhon", "Louis", "Mark"))
Mean <- as.character(c("Jhon", "German", "Jesse"))
Cool <- as.character(c("Louis", "Jack", "Jesse"))
Naive <- as.character(c("Walter", "German", "Mark"))

Это пример того, что у меня уже есть входные данные.

df <- data.frame(Gentle, Mean, Cool, Naive)

И вот что Я ожидаю получить, где имена субъектов (имена генов) имеют значение Boolen, получая сравнительную таблицу.

result <- data.frame(Gentle = c(T,T,T,F,F,F,F), Mean = c(T,F,F,T,T,F,F),
                     Cool=c(F,T,F,F,T,T,F), Naive = c(F,F,T,T,F,F,T))
rownames(result) <- as.character(c("Jhon", "Louis", "Mark", "German", "Jesse", "Jack","Walter"))
colnames(result) <- as.character(c("Gentle", "Mean", "Cool", "Naive"))

Каков наилучший способ получить это? Я еще ничего не пробовал.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Мы могли бы использовать table на stack

table(stack(df)) > 0
#       ind
#values   Gentle  Mean  Cool Naive
#  German  FALSE  TRUE FALSE  TRUE
#  Jack    FALSE FALSE  TRUE FALSE
#  Jesse   FALSE  TRUE  TRUE FALSE
#  Jhon     TRUE  TRUE FALSE FALSE
#  Louis    TRUE FALSE  TRUE FALSE
#  Mark     TRUE FALSE FALSE  TRUE
#  Walter  FALSE FALSE FALSE  TRUE

Или используя pivot_longer/pivot_wider

library(dplyr)
library(tidyr)
pivot_longer(df, everything()) %>% 
   dplyr::count(name, value) %>%
   pivot_wider(names_from = name, values_from = n, 
     values_fn = list(n = ~length(.) > 0), values_fill = list(n = FALSE))
1 голос
/ 20 апреля 2020

Мы можем получить unique имена из фрейма данных, используя sapply до l oop для каждого столбца и table, чтобы получить их присутствие / отсутствие.

unique_name <- unique(unlist(df))
sapply(df, function(x) table(factor(x, levels = unique_name)) > 0)

#       Gentle  Mean  Cool Naive
#Jhon     TRUE  TRUE FALSE FALSE
#Louis    TRUE FALSE  TRUE FALSE
#Mark     TRUE FALSE FALSE  TRUE
#German  FALSE  TRUE FALSE  TRUE
#Jesse   FALSE  TRUE  TRUE FALSE
#Jack    FALSE FALSE  TRUE FALSE
#Walter  FALSE FALSE FALSE  TRUE
...