Второй аргумент функции mapply inside как вектор в R

Я знаю, что название немного сбивает с толку, извините за него. Сначала немного кода для генерации данных, которые нам нужны:

ref_variables=LETTERS[1:10]
# Function to generate one dataset
generate_df=function(){
row=100
d0=seq(1:100)
for (i in seq_along(ref_variables)){
  dtemp=sample(seq(1:row),row,TRUE)
  d0=data.frame(d0,dtemp)
}
d0[,1]=NULL
names(d0)=ref_variables
return(d0)
}

# Generating a list of dataset
list_of_df=lapply(seq(1:100),function (x){
  generate_df()
} )

# Générating a list of vectors
df_vector=sample(ref_variables,3,FALSE)
for (i in seq(2,100)){
tmp=sample(ref_variables,3,FALSE)
df_vector=rbind(df_vector,tmp)
}
list_of_vector <- split(df_vector, seq(nrow(df_vector)))

Итак, у меня есть функция some_function, которая принимает data.frame и вектор в качестве аргументов:

#Some function a data.frame and a vector as arguments
some_function=function(a_df,a_vector){
  return(a_df[,a_vector])
}

У меня есть список data.frame и список векторов. Итак, я хочу сопоставить data.frame с вектором в соответствии с их положением в качестве аргументов some_function. В частности, хотелось бы побегать:

some_function(list_of_df[[1]],unlist(list_of_vector[[1]]))
some_function(list_of_df[[2]],unlist(list_of_vector[[2]]))
some_function(list_of_df[[3]],unlist(list_of_vector[[3]]))
and so on ...

Поэтому я решил использовать функцию mapply с:

big_results=mapply(some_function,
                   list_of_df,
                   list_of_vector)

Но big_results имеет длину 300, хотя я ожидал только 100. И очевидно, что результаты тоже не такие, как я ожидал. Кто-нибудь знает, что здесь происходит и как это исправить?


person hans glick    schedule 04.06.2016    source источник


Ответы (1)


Нам нужно использовать либо Map

r1 <- Map(function(x,y) x[,y], list_of_df, list_of_vector)
length(r1)
#[1] 100

Или mapply с SIMPLIFY = FALSE

r2 <- mapply(function(x,y) x[,y], list_of_df, list_of_vector, SIMPLIFY=FALSE)
length(r2)
#[1] 100

Map - это просто оболочка для mapply с опцией SIMPLIFY=FALSE. Что происходит, когда размеры объекта совпадают, это упрощается до матрицы для mapply, поскольку параметр по умолчанию - SIMPLIFY = TRUE

r3 <- mapply(function(x,y) x[,y], list_of_df, list_of_vector)
length(r3)
#[1] 300

length в matrix - это произведение его размеров, т. Е.

m1 <- matrix(1:6, ncol=2)
length(m1)
#[1] 6
person akrun    schedule 04.06.2016
comment
Вау, круто! Извините, я знаю, что могу выполнить поиск в Google, но, поскольку вы можете быть в этом компетентны, вы можете сказать мне, что такое оболочка? Я никогда не мог этого понять. - person hans glick; 04.06.2016
comment
@hansglick Просто введите Map на консоли. Будет выдано function (f, ...) { f <- match.fun(f) mapply(FUN = f, ..., SIMPLIFY = FALSE) } - person akrun; 04.06.2016