Как работает lapply - lapply dcast? - PullRequest
4 голосов
/ 31 января 2012

Очевидно, я до сих пор не до конца понимаю, как на самом деле работает 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(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" ))

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

РЕДАКТИРОВАТЬ: Я удивлен, что ответы Джошуа именно то, что я хочу.Я был на этом следе раньше, но отклонил его рано, когда попытался:

 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>

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

1 Ответ

5 голосов
/ 31 января 2012

В вашем первом примере 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)
...