如何在R中将列拆分为两列?

时间:2015-12-05 19:58:45

标签: r dataframe

I have a data.frame that looks like:
Input_SNP       Set_1           Set_2           Set_3           
4:184648954     18:71883827     7:135798891     7:91206783    
13:34371442     14:52254555     1:223293324     7:54912662     
18:71883393     22:50428069     7:138698825     8:97486210     

我想在冒号之前添加数字,并为每个列创建一个名为CHR的新列。我想在冒号后提取数字并将其设为一个名为BP的新列。为了使这更清楚,这就是所需的输出:

    Input_SNP_CHR   Input_SNP_BP     Set_1_CHR   Set_1_BP     Set_2_CHR   Set_2_BP     Set_3_CHR   Set_3_BP
    4                 184648954           18     71883827       7         135798891      7        91206783  
    13                34371442            14     52254555       1         223293324      7        54912662
    18                71883393            22     50428069       7         138698825      8        97486210

因此,我想从N列开始并以2N列结束。我怎样才能做到这一点?我应该使用grep吗?

1 个答案:

答案 0 :(得分:2)

这是一种方法:

library(splitstackshape)
df <- read.table(header=T, text="Input_SNP       Set_1           Set_2           Set_3           
4:184648954     18:71883827     7:135798891     7:91206783    
13:34371442     14:52254555     1:223293324     7:54912662     
18:71883393     22:50428069     7:138698825     8:97486210")
df <- cSplit(df, 1:4, ":")
names(df) <- paste0(sub("(.*_).*", "\\1", names(df)), c("CHR", "BP"))
df
#    Input_SNP_CHR Input_SNP_BP Set_1_CHR Set_1_BP Set_2_CHR  Set_2_BP Set_3_CHR Set_3_BP
# 1:             4    184648954        18 71883827         7 135798891         7 91206783
# 2:            13     34371442        14 52254555         1 223293324         7 54912662
# 3:            18     71883393        22 50428069         7 138698825         8 97486210