【问题标题】:Merge two list components合并两个列表组件
【发布时间】:2011-12-07 10:01:47
【问题描述】:

我有一个很大的列表,但微示例如下:

A <- c("A", "a", "A", "a", "A")
B <- c("A", "A", "a", "a", "a")
C <- c(1, 2, 3, 1, 4) 
mylist <- list(A=A, B=B, C= C)

预期的输出是将 A 与 B 合并,以便每个组件看起来像 AB

AA, aA, Aa, aa, Aa

最好排序,大写总是在前

AA, Aa, Aa, aa, Aa

因此新列表或矩阵应该有两列或两行:

AA, Aa, Aa, aa, Aa
1,   2, 3,   1, 4

现在我想根据类“AA”、“Aa”和“aa”计算 C 的平均值

看起来很简单,但我无法轻易弄清楚。

【问题讨论】:

    标签: list r merge


    【解决方案1】:

    使用您的数据:

    A <- c("A", "a", "A", "a", "A")
    B <- c("A", "A", "a", "a", "a")
    C <- c(1, 2, 3, 1, 4) 
    

    我定义了一个data.frame,使用A和B的组合作为键列:

    AB <- paste(A, B, sep='')
    df <- data.frame(id=AB, C=C)
    
    > df
      id C
    1 AA 1
    2 aA 2
    3 Aa 3
    4 aa 1
    5 Aa 4
    

    如果您需要在聚合之前订购此data.frame,则:

    df <- df[order(AB, decreasing=TRUE),]
    
    > df
      id C
     1 AA 1
     3 Aa 3
     5 Aa 4
     2 aA 2
     4 aa 1
    

    使用aggregate,您可以计算每个id 的平均值:

    meanDF <- aggregate(C~id, data=df, mean)
    
    > meanDF
    
      id   C
    1 aa 1.0
    2 aA 2.0
    3 Aa 3.5
    4 AA 1.0
    

    但是如果你想在聚合之后进行排序,那么:

    df <- data.frame(id=AB, C=C)
    meanDF <- aggregate(C~id, data=df, mean)
    meanDF <- meanDF[order(meanDF$id, decreasing=TRUE),]
    

    【讨论】:

      【解决方案2】:

      如果您的数据使用包plyr 排列在data.frame 中,我可以做到

      > A <- c("A", "a", "A", "a", "A")
      > B <- c("A", "A", "a", "a", "a")
      > C <- c(1, 2, 3, 1, 4) 
      > groups <- sort(paste(A, B, sep=""))
      [1] "AA" "aA" "Aa" "aa" "Aa"
      > my.df <- data.frame(A=A, B=B, C=C, group=groups)
      
      > require(plyr)
      > result <- ddply(my.df, "group", transform, group.means=mean(C))
      > result[order(result$group, decreasing=TRUE),]
        A B C group group.means
      5 A A 1    AA         1.0
      3 A a 3    Aa         3.5
      4 A a 4    Aa         3.5
      2 a A 2    aA         2.0
      1 a a 1    aa         1.0
      

      【讨论】:

        【解决方案3】:
        > (ab <- paste(A, B, sep="") )
        [1] "AA" "aA" "Aa" "aa" "Aa"
        > (ab <- paste(A, B, sep="") )  # the joining step
        [1] "AA" "aA" "Aa" "aa" "Aa"
        > (ab <- sub("([a-z])([A-Z])", "\\2\\1", ab) ) # swap lowercase uppercase
        [1] "AA" "Aa" "Aa" "aa" "Aa"
        
        > rbind(ab, C)                  # matrix
           [,1] [,2] [,3] [,4] [,5]
        ab "AA" "Aa" "Aa" "aa" "Aa"
        C  "1"  "2"  "3"  "1"  "4" 
        > data.frame(alleles=ab, count=C)  # dataframes are lists
          alleles count
        1      AA     1
        2      Aa     2
        3      Aa     3
        4      aa     1
        5      Aa     4
        

        【讨论】:

          猜你喜欢
          • 2020-02-19
          • 2017-09-26
          • 2020-12-19
          • 2017-03-23
          • 1970-01-01
          • 2012-10-15
          • 1970-01-01
          • 1970-01-01
          • 2014-03-19
          相关资源
          最近更新 更多