FORループを使用してRのいくつかの図を自動化する方法を探しています。
_dflist <- c("dataframe1", "dataframe2", "dataframe3", "dataframe4")
for (i in dflist) {
plot(i$var1, i$var2)
}
_
すべてのデータフレームには同じ変数、つまりvar1、var2があります。
for
ループはここでは最もエレガントな解決策ではないようですが、ダイアグラムでapply
関数を使用する方法がわかりません。
編集:
mean()
を使用した私の元の例は元の質問では役に立たなかったため、プロット関数に変更しました。
Beasterfieldの答えをさらに追加するために、各データフレームでいくつかの複雑な操作を実行したいようです。
Applyステートメント内に複雑な関数を含めることができます。だから今あなたが持っているところ:
for (i in dflist) {
# Do some complex things
}
これは次のように翻訳できます。
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
})
プロットを使用したより具体的な例:
# 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
これがあなたを助けることを願っています!
実際の質問に関しては、data.frame
s、matrix
sまたはlist
sのセル、行、および列にアクセスする方法を学ぶ必要があります。あなたのコードから、data.frame j
のi
番目の列にアクセスしたいので、次のように読みます。
mean( i[,j] )
# or
mean( i[[ j ]] )
$
演算子は、data.frame内の特定の変数にアクセスする場合にのみ使用できます。 i$var1
。さらに、[, ]
または[[]]
によるアクセスよりもパフォーマンスが低下します。
しかし、それは間違いではありませんが、for
ループの使用はそれほどR'ishではありません。ベクトル化された関数とapply
ファミリについて読む必要があります。したがって、コードは次のように簡単に書き直すことができます。
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]) } )
@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つのdata.frameに、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)
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)
}
スコットリッチーソリューションに基づくと、これは再現可能な例であり、lapplyからのフィードバックメッセージも非表示にします。
_# split dataframe by condition on cars hp
f <- function() trunc(signif(mtcars$hp, 2) / 100)
dflist <- lapply(unique(f()), function(x) subset(mtcars, f() == x ))
_
これは、mtcars
データフレームをhp
変数分類に基づくサブセットに分割します(100未満のHPの場合は0、100年代の場合は1、200の場合は1など)。
そして、それをプロットします:
_# use invisible to prevent the feedback message from lapply
invisible(
lapply(dflist, function(df) {
x2 <- df$mpg^2
log_y <- log(df$hp)
plot(x2, log_y)
NULL
}))
_
invisible()
はlapply()
メッセージを防ぎます:
_16
9
6
1
[[1]]
NULL
[[2]]
NULL
[[3]]
NULL
[[4]]
NULL
_