R 缺少值时抑制粘贴中的分隔符

R 缺少值时抑制粘贴中的分隔符,r,paste,ggplot2,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 治疗柱和egf柱的组合代表每个柱的唯一id。我想创建一个组合这些元素的列,这样

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

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时,它会执行以下恼人的操作:

>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轴上指定类别的另一种方法,那将非常有帮助。

由于复制您的示例比较困难,我自己做了以下几点:

d <- data.frame(a=c('a', 'b', ''), b=c('c', '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"     
d1粘贴后可以去掉“+”:

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

如果使用
sep=ifelse(egf==“”,“”,“+”)
会很好,但是
sep
paste
参数不能是向量。解决方法:将其作为常规参数传递

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

这是一个很好的例子,说明了
ifelse
何时能很好地工作:

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

您可以使用
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" 

如果您的具体目标是使用
ggplot2
的最终结果,那么您可能还想看看Hadley的
restrape2
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"