这是我读取到数据帧中的数据结构。
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轴上的类别的另一种方法,那将会很有帮助。
发布于 2013-01-11 11:48:04
使用sep = ifelse(egf == "", "", " + ")会很好,但是paste的sep参数不能是向量。解决方案:将其作为常规参数传递!
with(rawp, paste0(treatment, ifelse(egf == "", "", " + "), egf))发布于 2013-01-11 11:12:25
粘贴后可以去掉"+“:
sub(" \\+ $", "", paste(rawp$treatment, rawp$egf, sep=" + "))发布于 2013-01-11 11:06:01
因为很难复制你的例子,所以我写了我自己的:
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" https://stackoverflow.com/questions/14270950
复制相似问题