首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在用户定义的函数中调用变量,其中包含reshape2 2::熔体和reshape2 2::dcast

在用户定义的函数中调用变量,其中包含reshape2 2::熔体和reshape2 2::dcast
EN

Stack Overflow用户
提问于 2017-06-30 12:18:12
回答 2查看 206关注 0票数 2

我想转换这个数据框架

代码语言:javascript
复制
data <- data.frame(color=c("red","red","red","green","green","green","blue","blue","blue"),object=c("box","chair","table","box","chair","table","box","chair","table"),units=c(1:9),price=c(11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5))

给另一个人

代码语言:javascript
复制
output <- data.frame(color=c("red","green","blue"),units_box=c(1,4,7),price_box=c(11.5,14.5,17.5), units_chair=c(2,5,8),price_chair=c(12.5,15.5,18.5),units_table=c(3,6,9),price_table=c(13.5,16.5,19.5))

因此,我使用reshape2::meltreshape2::dcast来构建用户定义的函数,如下所示

代码语言:javascript
复制
fun<-function(df,var,group){
  r<-reshape2::melt(df,id.vars=var)
  r<-reshape2::dcast(r,var~group) 
return(r)
}

使用该函数时,如下所示

有趣(数据、颜色、物体)

我收到以下错误消息

Melt_check中的错误(数据、id.vars、measure.vars、variable.name、value.name):找不到对象“颜色”

你知道我该怎么解决吗?我认为问题在于我应该用引号调用reshape2::melt中的变量,但我不知道如何调用。

注1:我想保留变量的原始数字格式(即没有小数的对象,小数点的价格)。

注2:我想指出的是,我的真正代码(这只是一个简化的示例)要长得多,并且涉及到dplyr函数(包括my ()和UQ()函数)。因此,这种情况的解决方案应该与dplyr兼容。

注意3:我不使用tidyr (我是整个tidyverse的一个很大的乐趣),因为当前的tidyr仍然使用旧的语言作为函数,并且我与其他可能不愿意使用tidyr开发版本的人共享这个脚本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-05 21:06:59

我自己解决了这个问题(虽然我不太清楚背后的原因)。主要的问题,如我所怀疑的,是传递用户定义的函数的变量在熔体和dcast造成某种冲突,可能是由于缺乏引号(?)。无论如何,我使用dplyr::rename重命名了变量,这样名称不再依赖于变量,而取决于字符。在这里,您可以看到我正在应用的最终代码:

代码语言:javascript
复制
fun<-function(df,var,group){
  enquo_var<-enquo(var)
  enquo_group<-enquo(group)

  r<-df%>%
    reshape2::melt(., id.var=1, variable.name = "parameter")%>%
    dplyr::rename(var = UQ(enquo_var))%>%
    reshape2::dcast(data=., formula = var~parameter, value.var = "value")

return(r)
}

funx<-fun(data,color,object)

虽然我找到了解决我特定问题的办法,但如果有人能解释我背后的原因,我会非常感激的。

PS:我希望新版本的tidyr很快就能让这些任务变得更容易。谢谢你的出色工作。

票数 0
EN

Stack Overflow用户

发布于 2017-06-30 12:21:45

我们可以使用来自dcastdata.table

代码语言:javascript
复制
library(data.table)
dcast(setDT(data), color ~object, value.var = c("units", "price"), FUN = c(length, mean))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44846354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档