2015-10-02 104 views
0

我們如何通過按分隔符對列進行拆分並從各列中選擇最小值和最大值來對數據幀進行子集化。子集數據幀通過拆分列並選擇最小值和最大值

從data.frame df1,我想分隔列2到4由分隔符「;」 。 從塔2只選擇從第4列第3列選擇最小值和 第一個字符向量 選擇最大值

df1 <- 
    Geneid    Chr    Start      End 
    CPA1  chr7;chr7;chr7;chr7  60837277;60842119;60844209 60858738;60860094;60861430 
    GUCY2D chr17;chr17;chr17;chr17 60864066;60865166;60867516 60871561;60873263;60874538 
    UBC  chr12;chr12;chr12;chr12 61053840;61054888;61056916 61090048;61090639;61092555  


df2 <- 
    Geneid Chr Start  End 
    CPA1  chr7  60837277 60861430 
    GUCY2D chr17 60864066 60874538 
    UBC  cr12  61053840 61092555 
+0

可以dput你的數據? –

回答

2

使用sub

x <- "  Geneid    Chr    Start      End 
    CPA1  chr7;chr7;chr7;chr7  60837277;60842119;60844209 60858738;60860094;60861430 
    GUCY2D chr17;chr17;chr17;chr17 60864066;60865166;60867516 60871561;60873263;60874538 
    UBC  chr12;chr12;chr12;chr12 61053840;61054888;61056916 61090048;61090639;61092555  
" 
df1 <-read.table(text=x, header=T) 
data.frame(Geneid=df1$Geneid,Chr=sub(";.*", "", df1$Chr), Start=sub(";.*", "", df1$Start), End=sub(".*;", "", df1$End)) 
# Geneid Chr Start  End 
# 1 CPA1 chr7 60837277 60861430 
# 2 GUCY2D chr17 60864066 60874538 
# 3 UBC chr12 61053840 61092555 

data.frame(Geneid=df1$Geneid,Chr=sub(";.*", "", df1$Chr), Start=sapply(strsplit(as.character(df1$Start),";"),function(x) min(as.numeric(x))), End=sapply(strsplit(as.character(df1$End),";"),function(x) max(as.numeric(x)))) 
+1

如果這些值不符合「開始」或「結束」,該怎麼辦? - 例如'sub(「;。*」,「」,「3; 2; 1」)'不返回最小值。 – thelatemail

+1

'sapply(strsplit(「3; 2; 1」,「;」),function(x)min(as.numeric(x)))''在另一方面工作得很好。 – thelatemail

+0

@thelatemail ya,剛纔注意到最小和最大值.. –

1
library(dplyr) 
library(tidyr) 
library(stringi) 

df1 %>% 
    gather(variable, value, -Geneid) %>% 
    mutate(value = value %>% stri_split_fixed(";")) %>% 
    unnest(value) %>% 
    group_by(Geneid, variable) %>% 
    mutate(group_id = 1:n()) %>% 
    ungroup %>% 
    spread(variable, value) %>% 
    group_by(Geneid) %>% 
    summarize(Start = Start %>% as.numeric %>% min(na.rm = TRUE), 
      End = End %>% as.numeric %>% max(na.rm = TRUE), 
      Chr = first(Chr)) 
相關問題