缺少值时,在粘贴中禁止分隔符

时间:2013-01-11 02:58:10

标签: r paste ggplot2

这是我读入数据帧的数据结构。

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

treatment和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轴时似乎只需要1个唯一的列。

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

因此,如果您也知道使用组合列在x轴上指定类别的替代方法,那将会有所帮助。

5 个答案:

答案 0 :(得分:5)

您可以在粘贴后删除“+”:

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

答案 1 :(得分:5)

使用sep = ifelse(egf == "", "", " + ")会很好,但sep的{​​{1}}参数不能是矢量。解决方案:将其作为常规参数传递!

paste

答案 2 :(得分:1)

这是ifelse很好地运作的一个很好的例子:

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

答案 3 :(得分: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"     

答案 4 :(得分: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"