2017-07-29 63 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