在 dcast 中使用自定义函数 (ifelse)

Using a custom function (ifelse) with dcast

我对重塑数据框很感兴趣,但我不想使用 mean 等标准 dcast 函数,而是想使用自定义函数。具体来说,我对使用 ifelse 语句来分配二进制值很感兴趣。

这是一个可重现的例子:

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

如果我只使用一个标准函数就可以工作,比如 mean (ex):

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

但是在我的 ifelse() 函数中,我得到了一个关于数据类型的错误(逻辑与双精度),这对我来说没有意义,因为 "mean(u) > 5" 的结果应该返回一个逻辑结果(TRUE 或 FALSE),然后由 ifelse() 部分使用。

我相信这与类型强制的细节有关。您的自定义函数的 return 对于某些观察集被视为 double,但在其他观察集中是合乎逻辑的。当您明确指定 return 类型时,该代码有效。

示例:

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