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)