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"