无法为 R 函数中的子集插入列名称

Trouble interpolating column name for subset in R function

我有(fbodata) 'data.frame': 6181090 obs. of 41 variables:

我想对其进行子集化并保存属于特定子集的部分(如 zip)。当它不在函数中时,我的方法似乎有效,但我最终想使用 sapply。

    nmakedir <- function(item, ccol) {
  snipped a bunch of code that works
    trim<- fbodata[ which(paste(ccol)==item),]
    trim%>% drop_na(paste(ccol))
    trim<- droplevels(trim
    save(trim, file = paste(item, "rda", sep="."))
        }

不起作用的那一行是我创建子集的那一行。如果我使用 fbodata$zip 而不是 paste(ccol) 对行进行硬编码,它就可以正常工作。最终,我打算用这样的方式来调用它:

sapply(unique(fbodata$zip),zip, FUN = nmakedir)

感谢任何线索,我已经研究了很长时间。

发生的一些事情:

  • ccol 是一个字符串。 paste(ccol) 是同一个字符串。您永远不需要仅使用一个参数调用 paste。 (您可以使用 paste 将非字符串强制转换为字符串,但在这种情况下您应该使用 as.character() 来清楚。)

  • 记住 ccol 是一个字符串,什么是 fbodata$zip?是专栏!使用 ccol 和括号的等效项是什么? fbodata[[ccol]]fbodata[, ccol]。您可以将其中任何一个与 fbodata$zip 互换使用。所以,这条坏线

     fbodata[ which(paste(ccol)==item),]
     # should be this:
     fbodata[which(fbodata[[ccol]] == item), ]
    
  • drop_na,像大多数 dplyr 函数一样,期望(从帮助中引用)“裸变量名”,而不是字符串.同样来自帮助,“另请参阅:drop_na_ 用于使用常规评估并适合使用 进行编程的版本”。在这种情况下,我认为您只需将 drop_na 替换为 drop_na_.

  • 您的 droplevels 命令中缺少右括号。

可能还有更多,但这是我在没有任何样本数据的情况下看到的。你的 sapply 调用对我来说看起来很有趣,因为我认为 zip 应该是一个列名,但是当你调用 sapply(unique(fbodata$zip),zip, FUN = nmakedir) 时它需要是你的全局环境中的一个对象。我认为 sapply(unique(fbodata$zip), 'zip', FUN = nmakedir) 更有意义,但如果没有可重现的示例,则无法知道。

您似乎也在编写自己的 split 版本。我可能会从 fbo_split = split(fbodata, fbodata$zip) 开始,然后使用 lapplydrop_na_droplevelssave,但也许你的代码片段使它变得不那么好想法。