2016-09-25 109 views
0

我對整形數據框很感興趣,但我不想使用標準dcast函數(如mean),而是使用自定義函數。具體來說,我有興趣使用ifelse語句來分配二進制值。使用自定義函數(ifelse)和dcast

這裏有一個重複的例子:

# dataframe that includes extraneous information 
df <- data.frame(sale_id=c(1,1,1,2,2,2,3,3,4,5),project_id=c(501,502,503,501,502,503,501,502,504,505), 
      sale_year=c(1990,1991,1993,1990,1992,1990,1991,1993,1990,1992), 
      var1=c(5,4,3,6,5,4,4,7,2,9),var2=c(7,3,4,8,5,8,2,3,5,7)) 

# list of the variables I actually need (I don't need 'sale_year') 
varlist <- c("var1","var2") 

# selecting out id variables and variables I'm interested in manipulating 
dfvars <- df[,c("sale_id","project_id",varlist)] 

# melt dataframe 
library(reshape2) 
mdata <- melt(dfvars, id=c('sale_id','project_id')) 

# create custom ifelse function, assign '1' if mean is above a critical value, and '0' if not 
funx <- function(u){ifelse(mean(u)>5,1,0)} 

# cast data using this function 
cdata <- dcast(mdata, sale_id~variable, funx) 

如果我只是用一個標準功能,如均值(EX),它的工作原理:

cdata <- dcast(mdata, sale_id~variable, mean) 

但我ifelse()函數,我得到一個因爲「mean(u)> 5」的結果應該返回一個邏輯結果(TRUE或FALSE),然後被使用的數據類型的錯誤(邏輯與雙精度),這對我來說沒有意義。 ifelse()部分。

+0

我想你可以使用'if_else'從'dplyr'包和避免錯誤。 – eipi10

回答

1

我相信這與強制類型的細節有關。您的自定義函數的返回被視爲對於某些觀察集合的雙重處理,但在其他情況下是合乎邏輯的。代碼在您明確返回類型時起作用。

例子:

# Works 
funx1 <- function(u){ifelse(mean(u)>5,TRUE,FALSE)} 
funx2 <- function(u){as.logical(ifelse(mean(u)>5,1,0))} 
funx3 <- function(u){as.numeric(ifelse(mean(u)>5,1,0))}