0

多年来,我一直在使用常规的 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)) 
4

0 回答 0