私は何年もの間、通常の R 構文を使用してきましたが、現在はパイプ構文に切り替えようとしています。私は単に解決できなかった問題に出くわしました。何時間も成功しなかった (そして多くの学習があった) 後、私の問題はこれであり続けます: 長い形式のファイルから vcd モザイク プロットを生成し、因子 (実際には個々の変数) のレベルを取得して、それらを割り当てることができるようにしたいと考えています。 a) モザイク プロット タイトル (main=) および b) プロットのファイル名に、個々の説明的な識別子を付けてプロットを保存できるようにします。
これまでのところ、私のコードは次のようになります。
library(vcd)
library(tidyerse)
df2 <- df %>% select(Group, Grade, variable, value) %>% ## note: value is integer
group_split(variable, .keep=F) %>% ## (tried group_by but did not work)
modify(drop_na) %>% ## (need to remove NAs per variable,
## not on a complete cases basis)
map(structable) %>% ## tried it along with ftable but structable
## alone was better
setNames(unique(df$variable)) %>% ## assigns the variable’s name to each df
## generated when invoking group_split
map(., mosaic, shade=T, legend=T, main=names(.)) ### here is my problem
このコードは部分的にしか機能しません。私の問題は、最後の行で、変数の名前を取得してそれを「main =」引数として使用するときに、names(.) に沿った反復がないことです。私が得るのは、プロットのタイトルとして常に割り当てられるこのベクトル (リスト?) の最初の要素 (var1) だけです。これはもちろん役に立ちません。プロットを wd に保存する方法も調べましたが、変数のレベル (名前) を反復処理できない場合はプロットを上書きするため、実際にはあまり努力していません。役に立たない。これまでのところ、map2、do、lapply、およびそれらのバリエーションを試しましたが、できません。また、変数の名前を含むオブジェクトを生成しようとしました (おそらく、私の R Base 育成が発言権を持とうとしていたのでしょう) が、どちらも機能しませんでした。
私のコードでは、新しいオブジェクト (df2) を生成しますが、これが有用かどうかはわかりませんが、ある時点で、意図したプロットを含むグループ化された tibble を生成するのに役立ちました (これは、最後のコード行で使用して行いました)。私自身の関数)、しかし、そこに着いた後でも、必要な名前を取得して割り当てる方法を理解できませんでした。
それで、私の質問は…パイプ構文を使用して実際に名前のリストを反復処理し、後でそれらの反復された名前をオブジェクト引数とファイル名に割り当てる方法はありますか? この問題は、これ以外のコンテキストで発生する可能性があると思います。forループに頼ってこのすべてを解決するのは簡単なことだと私は知っています(私は実際にすでにそれを行っています)。問題は、これをどのようにパイプするかです。
アップデート
このレベッカ・バーターの投稿のおかげで、ほとんど問題を解決できました(どうもありがとう!!!!それは私を夢中にさせていました):
https://www.rebeccabarter.com/blog/2019-08-19_purrr/
これが私の回避策です:
a=unique(df$variable) #vector with names/levels
# ad-hoc function
mos <- function(.x, .y) {
mosaic(.x, shade=T, legend=T, main=.y)
dev.copy(png, paste0(.y, ".png"))
dev.off()
}
df2 <- df %>% select(Group, Grade, variable, value) %>%
group_split(variable, .keep=F) %>%
modify(drop_na) %>% map(structable)
map2(df2, a, mos) # map2 with target vectors and my function
このアプローチは機能しますが、元の for ループよりもはるかに冗長ではありません。
それでも、これでぐっすり眠れます
データ:
df <- data.frame(subjects=c("DT30M", "DT39H", "TEL51M", "TEL9M", "DT30M", "DT39H",
"TEL51M", "TEL9M", "DT30M", "DT39H", "TEL51M", "TEL9M"),
## between factor
Group=c("DT", "DT", "TEL" , "TEL", "DT", "DT", "TEL" , "TEL",
"DT", "DT", "TEL" , "TEL"),
## within factor
Grade=c("2nd", "4th", "2nd", "4th", "2nd", "4th", "2nd", "4th",
"2nd", "4th", "2nd", "4th"),
## within factor
variable=c("var1", "var1", "var1", "var1", "var2", "var2",
"var2", "var2", "var3", "var3", "var3", "var3"),
value=c(1, 0, NA, 1, 1, 0, 1, NA, 0 , 1, 1, 1))