通过拆分列并选择最小值和最大值来子集数据帧

时间:2015-10-02 08:22:32

标签: r

我们如何通过按分隔符拆分列并从各列中选择最小值和最大值来对数据帧进行子集化。

从data.frame df1,我想通过分隔符";"将列从2分割为4。 。 从第2列中仅选择第一个字符向量 从第3列中选择最小值和 从第4列中选择最大值

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  

2 个答案:

答案 0 :(得分: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 :(得分: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) )