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

治療列とegf列の組み合わせは、各列の一意のIDを表します。これらを組み合わせた列を作成して、各行を一意に表す1つの列を作成したいと思います。ただし、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

使用するのは良かったのですsep = ifelse(egf == "", "", " + ")が、のsep引数をpasteベクトルにすることはできません。解決策:通常の引数として渡します!

with(rawp, paste0(treatment, ifelse(egf == "", "", " + "), egf))
于 2013-01-11T03:48:04.053 に答える
5

貼り付けた後に「+」を取り除くことができます:

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

これは、ifelseうまく機能する場合の良い例です。

ifelse(rawp$egf=="", paste(rawp$treatment), 
                     paste(rawp$treatment, rawp$egf, sep=" + "))
于 2013-01-11T05:34:27.850 に答える
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!=''

これは、3 つ以上の列があり、いずれかの列に欠損値がある可能性がある場合にも当てはまります。

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 に答える
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" 
于 2013-01-11T09:59:24.453 に答える