我对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问题的搜索技巧是有限的。
答案 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")