6

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

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

4

5 回答 5

5

您可以在粘贴后去掉“+”:

sub(" \\+ $", "", paste(rawp$treatment, rawp$egf, sep=" + "))
于 2013-01-11T03:12:25.460 回答
5

使用起来会很好,sep = ifelse(egf == "", "", " + ")sep参数paste不能是向量。解决方案:将其作为常规参数传递!

with(rawp, paste0(treatment, ifelse(egf == "", "", " + "), egf))
于 2013-01-11T03:48:04.053 回答
1

由于很难复制您的示例,因此我自己制作了:

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"     
于 2013-01-11T03:06:01.497 回答
1

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

ifelse(rawp$egf=="", paste(rawp$treatment), 
                     paste(rawp$treatment, rawp$egf, sep=" + "))
于 2013-01-11T05:34:27.850 回答
0

您可以使用applydata.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" 
于 2013-01-11T09:59:24.453 回答