[英]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.