我对重塑数据帧感兴趣,但我不想使用像平均值这样的标准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)&gt; 5”的结果应该返回逻辑结果(TRUE或FALSE),然后由ifelse()部分使用。
答案 0 :(得分:1)
我认为这与类型强制的细节有关。对于某些观察集,您的自定义函数的返回被视为double,但在其他观察中则是合乎逻辑的。当您明确返回类型时,代码可以正常工作。
示例:
# 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))}