这是我读入数据帧的数据结构。
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轴上指定类别的替代方法,那将会有所帮助。
答案 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"