2013-05-23 8 views
5

を通じて私はFORループを使用してRでのいくつかの図を自動化する方法を探しています:ループデータフレームと変数名

dflist <- c("dataframe1", "dataframe2", "dataframe3", "dataframe4") 

for (i in dflist) { 
    plot(i$var1, i$var2) 
} 

すべてのデータフレームは同じ変数、すなわちVAR1、VAR2を持っています。

ここでは、forループは最も洗練された解決策ではありませんが、applyの機能をダイアグラムに使用する方法はわかりません。

EDIT:

私の元の例mean()を使用して、元の問題の助けにはならなかったので、私はプロット機能にそれを変更しました。

+2

'for'ループを使用して結構です。実際のdata.framesをベクトルの名前だけでなくリストに入れてください。読みやすくするために、ループの内容を 'plot(var2〜var1、data = i)'に変更することもできます。しかし、プロットを保存する( '?pdf'を読む)か、複数のプロットを1つのグラフページ('?par'を読んでください)に入れたいかもしれません。 – Roland

+0

私はRolandに賛成ですが、forループのほうがうまくいきますが、この例ではdata.frameのリストはlapplyにはうってつけです。 –

+0

@arumbay 'ggplot2'パッケージのファセットをチェックして、プロットのグループを作成します。 –

答えて

9

あなたがデータフレームのそれぞれに複雑な操作をいくつかやりたいように、それはそうです。

適用ステートメント内で複雑な機能を使用することは可能です。だから、あなたが今持っている場所:

lapply(dflist, function(df) { 
    # Do some complex operations on each data frame, df 
    # More steps 

    # Make sure the last thing is NULL. The last statement within the function will be 
    # returned to lapply, which will try to combine these as a list across all data frames. 
    # You don't actually care about this, you just want to run the function. 
    NULL 
}) 

プロットを使用して、より具体的な例:

for (i in dflist) { 
    # Do some complex things 
} 

これは、に変換することができ

# Assuming we have a data frame with our points on the x, and y axes, 
lapply(dflist, function(df) { 
    x2 <- df$x^2 
    log_y <- log(df$y) 
    plot(x,y) 
    NULL 
}) 

また、複数の引数を取る複雑な関数を書くことができます:

lapply(dflist, function(df, arg1, arg2) { 
    # Do something on each data.frame, df 
    # arg1 == 1, arg2 == 2 (see next line) 
}, 1, 2) # extra arguments are passed in here 

これがあなたを助けてくれることを願っています!

+0

ありがとう、それは非常に役に立ち、適用機能の背後にある原則をよりよく理解する助けになりました! –

6

実際の質問については、data.framematrix、またはlistのセル、行、列にアクセスする方法を学ぶ必要があります。あなたのコードから私はあなたがdata.frame iの列番目j」にアクセスしたいと思いますので、それは読んでください:あなたが特定の変数にアクセスしたい場合は

mean(i[,j]) 
# or 
mean(i[[ j ]]) 

$オペレータにのみ使用することができ、あなたのdata.frame、例えばi$var1。さらに、[, ]または[[]]によるアクセスよりパフォーマンスが低下します。

しかし、間違っていませんが、forの使用はそれほどR'ishではありません。ベクトル化された関数とapplyファミリについて読むべきです。だからあなたのコードが簡単のように書き換えることができる。さらにBeasterfieldの答えに追加するには

set.seed(42) 
dflist <- vector("list", 5) 
for(i in 1:5){ 
    dflist[[i]] <- data.frame(A = rnorm(100), B = rnorm(100), C = rnorm(100)) 
} 
varlist <- c("A", "B") 

lapply(dflist, function(x){ colMeans(x[varlist]) }) 
+0

ありがとう - 私のmean()の例が単純すぎるのではないかと心配しました。私は、一連のデータフレームを参照する散布図を自動的に生成する方法を探しています(上記の例の変更を参照)。私はこれも応用関数を使って可能ですか? –

1
set.seed(42) 
dflist <- list(data.frame(x=runif(10),y=rnorm(10)), 
       data.frame(x=rnorm(10),y=runif(10))) 

par(mfrow=c(1,2)) 
for (i in dflist) { 
    plot(y~x, data=i) 
} 
2

@Rolandの例を使用して、私はあなたにggplot2相当のものを示したかったのです。

まず、元データ:

> dflist 
[[1]] 
      x   y 
1 0.9148060 -0.10612452 
2 0.9370754 1.51152200 
3 0.2861395 -0.09465904 
4 0.8304476 2.01842371 
5 0.6417455 -0.06271410 
6 0.5190959 1.30486965 
7 0.7365883 2.28664539 
8 0.1346666 -1.38886070 
9 0.6569923 -0.27878877 
10 0.7050648 -0.13332134 

[[2]] 
      x   y 
1 0.6359504 0.33342721 
2 -0.2842529 0.34674825 
3 -2.6564554 0.39848541 
4 -2.4404669 0.78469278 
5 1.3201133 0.03893649 
6 -0.3066386 0.74879539 
7 -1.7813084 0.67727683 
8 -0.1719174 0.17126433 
9 1.2146747 0.26108796 
10 1.8951935 0.51441293 

と1つのデータにデータを置くまず、DATSETを少し変更する必要があります。idカラム

require(reshape2) 
one_df = melt(dflist, id.vars = c("x","y")) 
> one_df 
      x   y L1 
1 0.9148060 -0.10612452 1 
2 0.9370754 1.51152200 1 
3 0.2861395 -0.09465904 1 
4 0.8304476 2.01842371 1 
5 0.6417455 -0.06271410 1 
6 0.5190959 1.30486965 1 
7 0.7365883 2.28664539 1 
8 0.1346666 -1.38886070 1 
9 0.6569923 -0.27878877 1 
10 0.7050648 -0.13332134 1 
11 0.6359504 0.33342721 2 
12 -0.2842529 0.34674825 2 
13 -2.6564554 0.39848541 2 
14 -2.4404669 0.78469278 2 
15 1.3201133 0.03893649 2 
16 -0.3066386 0.74879539 2 
17 -1.7813084 0.67727683 2 
18 -0.1719174 0.17126433 2 
19 1.2146747 0.26108796 2 
20 1.8951935 0.51441293 2 

とプロットを行うとフレーム:

require(ggplot2) 
ggplot(one_df, aes(x = x, y = y)) + geom_point() + facet_wrap(~ L1) 

enter image description here