2016-09-25 108 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))}