簡體   English   中英

從 R 中的 df 創建比較表

[英]Create a comparative table from a df in R

我有一個數據框,其中一組基因名稱作為行,基因特征作為列。 我的想法是用 Boolean 值創建一個比較表,指示它們是否匹配一個或多個特征。

作為一個例子,我創建以下重新創建預期結果

首先,我在這里創建一個帶有人名的個人特征列表。 在我的真實數據中,它們是帶有基因名稱的基因特征。

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 的示例,我的輸入數據。

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

在這里,我期望得到的,主題名稱(基因名稱)有一個布爾值,獲得一個比較表。

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

我們可以在stack上使用table

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

我們可以從 dataframe 中獲取unique名稱,使用sapply遍歷每一列並使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM