【问题标题】:R: Transform dataframe to show the corresponding values of a column for each unique row of another column [duplicate]R:转换数据框以显示另一列的每个唯一行的列的相应值[重复]
【发布时间】:2021-07-28 09:04:26
【问题描述】:

我有一个包含 2 列的大型数据框:其中一个具有重复出现的离散数量的值,而另一个只有唯一值。基本上第 2 列中的多个值将对应第 1 列中的一个值。

由于当前已获取数据,因此将第 2 列中的每个唯一变量列为一行,这意味着第 1 列中存在重复值。

我想转换(基本上是翻转)数据,以便我可以看到第 2 列的哪些值属于第 1 列中的每个唯一值。

例如df是:

Contig Gene
C20 G1
C10 G2
C40 G3
C20 G4
C40 G5
C30 G6

我想要:

Contig Gene
C10 G2
C20 G1, G4
C30 G6
C40 G3, G5

如果我只得到唯一值的数量也可以:

Contig Gene(s)
C10 1
C20 2
C30 1
C40 2

我希望这是有道理的。我一直在努力寻找正确的关键字来解释这个问题,真的不知道从哪里开始。虽然我觉得我应该把数据变成一个列表。

【问题讨论】:

    标签: r dataframe grouping unique


    【解决方案1】:

    您也可以使用dplyr。先按Contig分组,然后总结。

    library(dplyr)
    
    # Small test data
    test_data <- data.frame(Contig = c("C10", "C10", "C20", "C20","C20"), 
                            Gene = c("G1", "G3", "G4", "G5", "G6"))
    
    
    clean_data <- test_data %>% 
      group_by(Contig) %>% 
      summarise(number_of_genes = length(unique(Gene)), 
                specific_genes = paste0(unique(Gene), collapse = ", "))
    
    
    

    【讨论】:

      【解决方案2】:
      library(plyr)
      M = data.frame(
        Contig = c("C20", "C10", "C40", "C20", "C40", "C30"),
        Gene = paste0("G",1:6)
      )
      f = function(m) {
        data.frame(
          Contig = unique(m$Contig),
          Gene = paste(m$Gene, collapse=",")
        )
      }
      ddply(M, .(Contig), f)
      

      【讨论】:

        【解决方案3】:

        要获得像您想要的第一个表一样的数据框,您可以使用

        library(tidyr)
        chop(df, Gene)
        

        同时获取您可能使用的最后一个:

        library(dplyr)
        df %>% group_by(Config) %>% summarise(n = n())
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-26
          • 1970-01-01
          • 2021-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多