2012-01-31 3 views
3

Очевидно, я до сих пор не совсем понимаю, как работает. Конечно, он применяет функцию над элементами списка и возвращает список. Однако, когда я использую его с пользовательскими функциями, я не уверен, как эффективно использовать его. Я хочу использовать его в пользовательской функции, которая использует dcast, например.Как работает lapply действительно - lapply dcast?

Сначала давайте пример набора данных:

df1 <- data.frame(idx=c(rep("a",3),rep("b",3),rep("c",3)), 
       cat=rep(1:3,3),var1=rnorm(9,0,1) 
) 



df2 <- data.frame(idx=c(rep("a",4),rep("b",4),rep("c",4)), 
       cat2=rep(1:4,3),var1=rnorm(12,0,1) 
      ) 

mylist <- list(cat=df1,cat2=df2) 


library(reshape2) 

### result that I want to get just for one data.frame 
dcast(df1,idx~cat,value_var="var1") 

Но я не могу получить это пойти с lapply, я попробовал:

lapply(mylist,function(x) substitute(dcast(x,idx~x,value_var="var1"))) 
## returns 
$cat 
dcast(X[[2L]], idx ~ X[[2L]], value_var = "var1") 

Очевидно, что X [[2L]] не будет работать при оценке выражения. Далее я попытался

lapply(names(mylist), function(x) dcast(mylist[[x]],idx~x,value_var="var1")) 

, который работал в каком-то подобном issue, но вызвал ошибку здесь. Должен ли я использовать здесь?

EDIT: Я удивлен, что ответы Джошуа - это именно то, что я хочу. Я был на этой тропе и раньше, но отклонил его раньше, когда я попробовал:

test <- function(x){ 
myformula <- as.formula(paste("idx~",x,sep="")) 
myformula 
} 

test(df2) 
## returns 
## > idx ~ c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3) 
## > <environment: 0x104f0a4d8> 

Очевидно слишком рано, но вы можете объяснить, что происходит?

ответ

4

В вашем первом примере x - это объект, переданный вашей функции. Во втором примере это строка символов. В обоих случаях это не символ, который представляет переменную в data, переданную в dcast.

Вы должны построить вашу формулу, используя имя элемента списка, так что-то вроде этого:

# define the function 
myfunc <- function(varname) { 
    # 'varname' is a character string naming the column to use 
    myformula <- as.formula(paste("idx~",varname,sep="")) 
    dcast(mylist[[varname]], myformula, value_var="var1") 
} 
# loop over list elements, by name 
lapply(names(mylist), myfunc) 
+0

Кроме того, я считаю, что это '' value.var' не value_var'. – joran

+0

@joran: "value_var имя столбца, в котором хранятся значения", указанном в 'dcast. возможно, ваш тоже работает, но мой единственный пример без сбоев работает. –

+1

@ ran2 Возможно, мы используем разные версии. Для меня он запускается, но выдает предупреждение о том, что, поскольку вы не передали значение для 'value.var', оно использует' var1' по умолчанию. – joran