R lapply разные функции для каждого элемента списка

У меня есть список (в R), где элементы имеют разные типы данных, например, первый элемент является числовым, а второй элемент-символом. Я хотел бы применить другую функцию к каждому элементу. Например, в приведенном ниже коде я пытаюсь применить функцию sum только к первому элементу и функцию length только ко второму элементу. Есть ли способ применить другую функцию к каждому элементу списка (без разбиения списка)?

data <- list(
  A = rnorm(10),
  B = letters[1:10]
)

lapply(data, list(sum, length))

mapply(function(x) sum, length, data)

2 ответов


как о

mapply(function(a,b) b(a), data, list(sum, length))

обратите внимание, что мы ставим функции в mapply в списке, а также.


Я бы сделал что-то вроде

sapply( data, function(x) (if(is.character(x)) length else sum)(x) )

сложные альтернативы. Если скорость-это проблема,vapply должно быть быстрее:

vapply( data, function(x) (if(is.character(x)) length else sum)(x), numeric(1) )

Если вам нужно использовать length много раз, это быстро, чтобы использовать lengths (доступно в R 3.2.0+):

res          <- lengths(data)
get_sum      <- !sapply(data,is.character)
res[get_sum] <- sapply(data[get_sum],sum)