多年来,我一直在使用常规的 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=”参数时,沿名称(。)没有迭代。我得到的只是这个向量(一个列表?)的第一个元素(var1),总是被指定为情节的标题,这当然是没有用的。我还探索了将情节保存到我的 wd 的方法,但实际上我并没有为此付出太多努力,因为如果我无法设法遍历变量的级别(名称),我将覆盖我的情节,这又是,没用。到目前为止,我已经尝试了 map2、do、lapply 和这些方法的变体,但我根本做不到。我还尝试生成一个包含变量名称的对象(可能是我的 R Base 教养试图发表意见),但这也不起作用。
在我的代码中,我生成了一个新对象(df2),我不确定它是否有用,但在某些时候帮助我生成了一个包含我认为预期图的分组小标题(这是我在最后一个代码行中使用的我自己的函数),但是一旦我到达那里,我仍然无法弄清楚如何检索和分配我需要的名称。
所以,我的问题是......有没有办法使用管道语法实际迭代名称列表,以便稍后将这些迭代的名称分配给对象参数和文件名?我怀疑这个问题可能会在除此之外的情况下出现。我知道使用 for 循环来解决所有这些问题是微不足道的(我实际上已经这样做了)。问题是如何管道。
更新
我设法解决了这个问题,主要归功于这个 Rebecca Barter 帖子(非常感谢!!!!它让我发疯):
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))