在 R 函数中为子集插入列名时遇到问题

Posted

技术标签:

【中文标题】在 R 函数中为子集插入列名时遇到问题【英文标题】:Trouble interpolating column name for subset in R function 【发布时间】:2017-10-31 12:42:00 【问题描述】:

我有(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】:

发生了一些事情:

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,但也许你的代码被剪掉了,这不是一个好主意。

【讨论】:

非常感谢,我理解你所说的,感谢你在我困惑的过程中涉水。

以上是关于在 R 函数中为子集插入列名时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

实体框架无效的列名

R:向空数据框添加行时丢失列名

循环遍历 R 中列名的特定子集

与R纠缠的两件事——rownames和子集--转载

R语言——K折交叉验证之随机均分数据集

更改 R 中数据框列表中的列名子集