簡體   English   中英

使用reshape2 :: melt和reshape2 :: dcast在用戶定義的函數中調用變量

[英]Calling variable in user-defined function with reshape2::melt and reshape2::dcast

我想轉換這個數據框

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))

到另一個

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來構建用戶定義的函數,如下所示

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函數(包括enquo()和UQ()函數)。 因此,這種情況下的解決方案應與dplyr兼容。

注3:我不使用tidyr(我對整個tidyverse感到很開心),因為當前的tidyr仍然使用舊語言編寫函數,並且與其他不願意使用tidyr開發版本的人共享腳本。 。

我們可以使用dcastdata.table

library(data.table)
dcast(setDT(data), color ~object, value.var = c("units", "price"), FUN = c(length, mean))

我自己解決了這個問題(盡管我不太清楚背后的原因)。 我懷疑主要的問題是在melt和dcast中傳遞用戶定義函數的變量,這可能是由於缺少引號(?)導致某種沖突。 無論如何,我使用dplyr :: rename重命名了變量,以便名稱不再取決於變量,而取決於字符。 在這里,您可以看到我正在應用的最終代碼:

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可以使這些任務變得更容易。 感謝@hadley所做的出色工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM