在 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)
开始,然后使用lapply
到drop_na_
、droplevels
和save
,但也许你的代码被剪掉了,这不是一个好主意。
【讨论】:
非常感谢,我理解你所说的,感谢你在我困惑的过程中涉水。以上是关于在 R 函数中为子集插入列名时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章