2017-07-29 64 views
2

我试图通过数据帧重新排列为长格式时遇到问题。 我的表看起来像这样:R基于拆分列名创建新列

x <- data.frame("Accession"=c("AGI1","AGI2","AGI3","AGI4","AGI5","AGI6"),"wt_rep_1"=c(1,2,3,4,4,5), "wt_rep_2" = c(1,2,3,4,8,9), "mutant1_rep_1"=c(1,1,0,0,5,3), "mutant2_rep_1" = c(1,7,0,0,1,5), "mutant2_rep_2" = c(1,1,4,0,1,8)) 

> x 
    Accession wt_rep_1 wt_rep_2 mutant1_rep_1 mutant2_rep_1 mutant2_rep_2 
1  AGI1  1  1    1    1    1 
2  AGI2  2  2    1    7    1 
3  AGI3  3  3    0    0    4 
4  AGI4  4  4    0    0    0 
5  AGI5  4  8    5    1    1 
6  AGI6  5  9    3    5    8 

我需要创建一个列,我会说出“基因型”,并“_” 如何使用 之前就拥有这个列名的第一部分strsplit(names(x), "_") 为什么? 和最好循环... 请,任何人,帮助。

+0

试着用'sub'即'子( “_ *”, “”,名称(X))'' – akrun

回答

2

在两条指令中,我将在第一个_之前提取部分列名x。请注意,它可以在一行中完成,但为了清晰起见,我这样发布。

sp <- strsplit(names(x), "_") 
sapply(sp[-1], `[`, 1) 

现在,这怎么能是data.framex新列?结果向量中只有五个元素,并且x有六行。

0

我同意鲁伊巴拉达斯:我不明白这个向量可能是你的原始数据框的一部分。你能澄清一下吗?

William Doane对this question的回复表明,使用正则表达式可能会有所斩获。我喜欢这种方法,因为我觉得它优雅而快捷:

> gsub("(_.*)$", "", names(x))[-1] 
    [1] "wt"  "wt"  "mutant1" "mutant2" "mutant2" 
+0

> x_long 加入基因型复制值 1 AGI1 wt rep1 1 2 AGI1 wt rep2 2 3 AGI1 mutant1 rep1 3 4 AGI1 mutant1 rep2 4'长格式是我最终想要的结果。非常感谢您的提示!我的意思是,长格式它仍然是同一张桌子,但为了以后最简单的导航和使用转置。更多的建议将是非常非常好的。 – tralala

+0

对不起,我有格式化问题x_long < - data.frame(“Accession”= c(“AGI1”,“AGI1”,“AGI1”,“AGI1”),“genotype”= c(“wt”,“wt” ,“突变体1”,“突变体1”),“复制品”= c(“rep1”,“rep2”,“rep1”,“rep2”),“值”= c(1,2,3,4)) > x_long – tralala