【问题标题】:subset dataframe by spliting columns and selecting minimum and maximum value通过拆分列并选择最小值和最大值来子集数据帧
【发布时间】:2015-12-30 10:17:47
【问题描述】:

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

从 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  

【问题讨论】:

  • 你能输入你的数据吗?

标签: r


【解决方案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) )

【讨论】:

    【解决方案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))))
    

    【讨论】:

    • 如果值不符合StartEnd 的顺序怎么办? - 例如sub(";.*", "", "3;2;1") 不返回最小值。
    • 另一方面,sapply(strsplit("3;2;1",";"), function(x) min(as.numeric(x)) ) 工作得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2020-10-30
    • 2019-02-09
    相关资源
    最近更新 更多