我可以根据其标识分隔列吗?

时间:2017-01-10 16:40:22

标签: r strsplit

我对R很新,我想知道是否可以根据他们的身份分隔列?例如,我想将第5列分成新列,所有列都以" E - "开头。在一列和所有" D - "在另一栏中。

chr1    11046   12418   2   E-H3K27ac,D-Both
chr1    18615   19392   2   D-Both,E-Both
chr1    27209   28559   3   E-H3K4me1,D-Both,E-Both
chr1    35274   35492   1   E-H3K4me1
chr1    36589   38097   2   D-Both,E-Both
chr1    43655   45148   2   D-Both,E-Both
chr1    49265   50054   2   D-Both,E-H3K4me1
chr1    50117   50465   1   E-H3K4me1

这样看起来像是:

chr1    11046   12418   2   E-H3K27ac        D-Both
chr1    18615   19392   2   E-Both           D-Both
chr1    27209   28559   3   E-H3K4me1,E-Both D-Both
chr1    35274   35492   1   E-H3K4me1
chr1    36589   38097   2   E-Both           D-Both
chr1    43655   45148   2   E-Both           D-Both
chr1    49265   50054   2   E-H3K4me1        D-Both
chr1    50117   50465   1   E-H3K4me1

我不确定是否需要先处理包含3个条目的行。 (在这个例子中,我可能只是将第3行中的2个E-开头转换为E-Both)。很抱歉,如果已经提出过类似的问题。我还在学习行话,所以我对r问题的搜索技巧是有限的。

1 个答案:

答案 0 :(得分:1)

我们可以使用base R执行此操作。使用,(如果是strsplit类,用factor包裹)将分隔符as.character(df1$Col)拆分为“{1”}到list,然后{{ 1}}按第一个字符(paste),substr(x, 1, 1)按降序分组后的元素。我们填充sort只包含NA的单个元素,list rbind元素的元素,并创建两个新列'E_col'和'D_col'

list

或另一种选择是使用lst <- lapply(strsplit(df1$Col, ","), function(x) sort(tapply(x, substr(x, 1, 1), FUN = toString), decreasing=TRUE)) df1[c("E_col", "D_col")] <- do.call(rbind, lapply(lst, `length<-`, max(lengths(lst)))) df1 # chr ID1 ID2 val Col E_col D_col #1 chr1 11046 12418 2 E-H3K27ac,D-Both E-H3K27ac D-Both #2 chr1 18615 19392 2 D-Both,E-Both E-Both D-Both #3 chr1 27209 28559 3 E-H3K4me1,D-Both,E-Both E-H3K4me1, E-Both D-Both #4 chr1 35274 35492 1 E-H3K4me1 E-H3K4me1 <NA> #5 chr1 36589 38097 2 D-Both,E-Both E-Both D-Both #6 chr1 43655 45148 2 D-Both,E-Both E-Both D-Both #7 chr1 49265 50054 2 D-Both,E-H3K4me1 E-H3K4me1 D-Both #8 chr1 50117 50465 1 E-H3K4me1 E-H3K4me1 <NA> 中的cSplit分割'Col'并将数据集重新整形为'long'格式,然后使用splitstackshape我们将其更改为'wide'

dcast

注意:正如@Frank在评论中建议的那样,将它保持为“长”格式(library(splitstackshape) dcast(cSplit(df1, "Col", ",", "long")[, toString(Col) , .(chr, ID1, ID2, val, grp=factor(substr(Col, 1, 1), levels = c("E", "D")))], ... ~ grp, value.var = "V1") 的输出)而不是将其组合回“宽”格式

可能会很好

数据

cSplit(df1, "Col", ",", "long")