【问题标题】:Create a comparative table from a df in R从 R 中的 df 创建比较表
【发布时间】:2020-04-19 21:33:09
【问题描述】:

我有一个数据框,其中一组基因名称作为行,基因特征作为列。我的想法是创建一个带有布尔值的比较表,指示它们是否匹配一个或多个特征。

作为示例,我创建以下重新创建预期结果

首先,我在这里创建一个带有人名的个人特征列表。在我的真实数据中,它们是带有基因名称的基因特征。

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

【问题讨论】:

    标签: r dataframe boolean


    【解决方案1】:

    我们可以从数据框中获取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
    

    【讨论】:

      【解决方案2】:

      我们可以在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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 2016-04-03
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        相关资源
        最近更新 更多