代码之家  ›  专栏  ›  技术社区  ›  rreck

在R函数中为子集插入列名时出错

  •  1
  • rreck  · 技术社区  · 7 年前

    我有 (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)
    

    我很感激任何线索,我已经在这方面很长时间了。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gregor Thomas    7 年前

    发生了一些事情:

    • ccol 是一个字符串。 paste(ccol) 是相同的字符串。你永远不需要打电话 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) 然后使用 lapply , 液滴液位 save ,但也许你删掉的代码让这不是一个好主意。