7

150 列までの大きなデータ テーブルがあります。それらの約 1/3 から一連のヒストグラムを作成する必要があります。50 行の同じプロット コマンドをスクリプトに入れるのではなく、使用する列を示すリストをループ処理したいと考えています。説明するためのテスト データセットを次に示します。

d <- data.frame(c(rep("A",5), rep("B",5)),
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE))

colnames(d) <- c("col1","col2","col3","col4","col5","col6" )


ggplot(data=d, aes(col2, fill= col1)) + geom_density(alpha = 0.5)

だから、これを50回書いてaes()値を置き換えるのではなく、もっとこういうことをしたいのです...

cols_to_plot <- c("col2","col4","col6")

for (i in length(cols_to_plot)) {
  ggplot(data=d, aes(cols_to_plot[i], fill= col1)) + geom_density(alpha = 0.5)

} 

しかし、もちろん、これは機能しません...このようなことを行う方法はありますか?

ありがとう!

4

4 に答える 4

10

データを溶かした方がいいと思います。これを試して:

library(reshape2)
d2 <- melt(d, id='col1')
ggplot(d2, aes(value, fill=col1)) + geom_density(alpha=.5) + facet_wrap(~variable)

または、最初にやりたかったことをしたい場合はaes_string、次のように使用します。

ggplot(data=d, aes_string(cols_to_plot[i], fill='col1')) + geom_density(alpha = 0.5)
于 2012-11-06T22:50:45.200 に答える
7

に代わるものがありaes()ます。aes_string(). これにより、美的マッピングの文字列を渡すことができます。col1ここで引用する必要があることに注意してくださいfill = "col1"。また、現在のデバイスでプロットを描画するには、ループ内でggplotオブジェクトを明示的に指定するfor()必要があることに注意してください。print()

d <- data.frame(c(rep("A",5), rep("B",5)),
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE))

colnames(d) <- c("col1","col2","col3","col4","col5","col6" )

cols_to_plot <- c("col2","col4","col6")

for (i in seq_along(cols_to_plot)) {
  print(ggplot(data=d, aes_string(x = cols_to_plot[i], fill= "col1")) +
    geom_density(alpha = 0.5))
}
于 2012-11-06T22:52:39.427 に答える
3

はい、aes_string

cols_to_plot <- c("col2","col4","col6")

for (i in cols_to_plot) {
  ggplot(data=d, aes_string(i, fill= 'col1')) + geom_density(alpha = 0.5)

} 
于 2012-11-06T22:49:27.247 に答える
2

lapply()forを使用したループの代わりにここで使用できますaes_string()

cols_to_plot <- c("col2","col4","col6")
lapply(cols_to_plot,function(i){
  ggplot(data=d, aes_string(x=i, fill= 'col1')) + 
    geom_density(alpha = 0.5)
} )
于 2012-11-06T22:54:02.350 に答える