2017-08-14 5 views
0

私は、遺伝子シンボル用と機能パスウェイ用の2つの列を持つデータフレームを持っています。各経路に属する多数の遺伝子があるので、経路列は反復された値を有する。各列が単一の経路であり、それらの列の各行がその経路に属する遺伝子であるように、このデータセットの順序を変更したいと思います。リピートを使用してデータフレームを転置する

開始データフレーム:

data.frame(pathway = c("p1", "p1", "p1", "p1", "p2", "p2", "p2"), 
gene.symbol = c("G1", "G2", "G3", "G4", "G33", "G43", "G10")) 

理想のデータフレーム:

data.frame(p1 = c("G1", "G2", "G3", "G4"), p2 = c("G33", "G43", "G10", 
"")) 

私がいないすべての列が同じ長さになることを知っているし、ブランク値を持つことがNASに好適です。

+0

列が同じ長さを持っていないので、あなたが作成オフに本当に優れています'data.frame'ではなく、標準的な' list'です。特に行1、列1は行1、列2とは何の関係もありません。 –

答えて

0

これは別のオプションです。分割素子としての経路を使用して、リストに

  1. スプリット

ここでデータフレームに戻って同じ長さに

  • 電源を入れ、それを他のすべてのグループを、各グループの最大長を取得し、設定しますコードです。

    mydf <- data.frame(pathway = c("p1", "p1", "p1", "p1", "p2", "p2", "p2"), 
          gene.symbol = c("G1", "G2", "G3", "G4", "G33", "G43", "G10")) 
    
    # function to run over each element in list 
    set_to_max_length <- function(x) { 
        length(x) <- max.length 
        return(x) 
    } 
    
    # 1. split into list 
    mydf.split <- split(mydf$gene.symbol, mydf$pathway) 
    
    # 2.a get max length of all columns 
    max.length <- max(sapply(mydf.split, length)) 
    
    # 2.b set each list element to max length 
    mydf.split.2 <- lapply(mydf.split, set_to_max_length) 
    
    # 3. combine back into df 
    data.frame(mydf.split.2) 
    

    EDITここ

    がtidyverseを使用して別のオプションである - もう少し簡潔:

    library(tidyverse) 
    mydf <- data.frame(pathway = c("p1", "p1", "p1", "p1", "p2", "p2", "p2"), 
            gene.symbol = c("G1", "G2", "G3", "G4", "G33", "G43", "G10")) 
    
    mydf %>% 
        group_by(pathway) %>% 
        mutate(rownum = row_number()) %>% 
        ungroup() %>% 
        spread(pathway, gene.symbol) %>% 
        select(-1) 
    
  • 0

    これは少し複雑に見えるかもしれませんが、それは最初に戻ってdata.frameよりもリストに移動して、所望の出力を実現:

    df$gene.symbol <- as.character(df$gene.symbol) 
    
    pw_list <- list() 
    for (pw in unique(df$pathway)) { 
        pw_list[[pw]] <- df[df$pathway == pw, "gene.symbol"] 
    } 
    pw_list 
    $p1 
    [1] "G1" "G2" "G3" "G4" 
    
    $p2 
    [1] "G33" "G43" "G10" 
    
    
    reordered <- matrix("", nrow = max(sapply(pw_list, length)), ncol = length(pw_list)) 
    colnames(reordered) <- names(pw_list) 
    
    for (pw in names(pw_list)){ 
        n <- length(pw_list[[pw]]) 
        reordered[1:n, pw] <- pw_list[[pw]] 
    } 
    reordered <- as.data.frame(reordered) 
    reordered 
        p1 p2 
    1 G1 G33 
    2 G2 G43 
    3 G3 G10 
    4 G4  
    

    EDIT

    もう少し簡潔版:

    df$gene.symbol <- as.character(df$gene.symbol) 
    pw_list <- list() 
    for (pw in unique(df$pathway)) { 
        pw_list[[pw]] <- df[df$pathway == pw, "gene.symbol"] 
    } 
    reordered <- as.data.frame(sapply(pw_list, "[", i = 1:max(sapply(pw_list, length))), 
              stringsAsFactors = FALSE) 
    reordered[is.na(reordered)] <- "" 
    names(reordered) <- names(pw_list) 
    
    関連する問題