2013-01-11 28 views
4

這是我讀入數據框的數據結構。當缺少值時,禁止粘貼分隔符

treatment egf  mean  se 
10 uM PP2   -697.25 14124.349 
10 uM PP2 1 nM EGF 14715.50 8862.012 
DMSO     58589.25 7204.824 
DMSO  1 nM EGF 87852.00 12149.159 

治療和egf列的組合代表每列的唯一ID。我想創建一個組合這些列的列,以便我可以有一列唯一地代表每一行。然而,因爲在EGF列中的遺漏值的,當我使用粘貼,它這個討厭的事:

>paste(rawp$treatment, rawp$egf, sep=" + ") 
[1] "10 uM PP2 + "   "10 uM PP2 + 1 nM EGF" "DMSO + "    
[4] "DMSO + 1 nM EGF" 

它仍然將放置隔板存在缺少值時。我希望看到:

[1] "10 uM PP2"   "10 uM PP2 + 1 nM EGF" "DMSO"    
[4] "DMSO + 1 nM EGF" 

我該怎麼做?

我想要這樣做的全部原因是因爲我想用ggplot繪製數據,而且在指定x軸時似乎只需要一個唯一的列。

ggplot(data=rawp, aes(x=treatment, y=mean)) + geom_bar(stat="identity") 

因此,如果您還知道另一種使用組合列來指定x軸上的類別的方法,那將會很有幫助。

+0

如果您的具體目標是要利用最後的結果爲'ggplot2',你可能想看看哈德利的'reshape2'包以及http://cran.r-project.org/web/packages/reshape2/ –

回答

5

使用sep = ifelse(egf == "", "", " + ")會很好,但pastesep參數不能是矢量。解決方案:將其作爲常規參數傳遞!

with(rawp, paste0(treatment, ifelse(egf == "", "", " + "), egf)) 
0

因爲它很難複製你的榜樣,我做了我自己:

d <- data.frame(a=c('a', 'b', ''), b=c('c', 'd', 'e')) 

你有什麼:

paste(d$a, d$b, sep=' + ') 
## [1] "a + c" "b + d" " + e" 

你想要什麼:

unlist(apply(d[1:2], 1, function(x) paste(x[x!=''], collapse=' + '))) 
## [1] "a + c" "b + d" "e"  

的解決方案是類似如果您有NA而不是''作爲空白值。在這種情況下,使用!is.na(x)而不是x!=''

這延伸到哪裏,你有超過兩列的情況,以及您可能已在任一列的缺失值:

d1 <- data.frame(a=c('a', 'b', ''), b=c('c', 'd', 'e'), c=c('', 'f', '')) 
unlist(apply(d1, 1, function(x) paste(x[x!=''], collapse=' + '))) 
## [1] "a + c"  "b + d + f" "e"  
3

可以剝離出「+」後粘貼:

sub(" \\+ $", "", paste(rawp$treatment, rawp$egf, sep=" + ")) 
1

這是當ifelse將很好地工作的好例子:

ifelse(rawp$egf=="", paste(rawp$treatment), 
        paste(rawp$treatment, rawp$egf, sep=" + ")) 
0

可以使用apply採取data.frame的每一行並去掉0長度的所有元素,然後使用在collapse參數帶回一個字符串:

apply(rawp[1:2],1,function(x) paste(x[nchar(x)>0],collapse=" + ")) 
[1] "10 uM PP2"   "10 uM PP2 + 1 nM EGF" "DMSO"     
[4] "DMSO + 1 nM EGF"